我正在尝试使用带有OAuth2的YouTube API v3 update
和delete
视频,以便通过google-api-client (0.6.4)
Ruby gem进行身份验证。但是,当我尝试执行这两个操作中的任何一个时,我看到以下错误消息:
Google::APIClient::ClientError: Insufficient Permission
奇怪的是:使用与update
和delete
完全相同的身份验证程序,我可以成功insert
(上传(,没问题!因此,我不认为这是我的身份验证设置的问题,而是代码中的其他地方。
我的读写scope
在以下任何操作中始终相同:
https://www.googleapis.com/auth/youtube https://www.googleapis.com/auth/youtube.upload
根据API文档,这组以空格分隔的作用域应该涵盖insert
、update
和delete
动作。
我的client_id
,client_secret
,refresh_token
对于所有这些动作也总是相同的 - 所以,这也不可能成为问题,不是吗?请注意,我的程序在过期时会自动获取新access_token
,因此,我再次不认为这就是问题所在。
为了进行比较,这是我的insert
(上传(代码的样子(这有效(:
# Auth stuff, then...
@client.execute!(
:api_method => @youtube.videos.insert,
:body_object => body,
:media => Google::APIClient::UploadIO.new(file_path, 'video/*'),
:parameters => {
'uploadType' => 'multipart',
:part => body.keys.join(','),
}
)
这是我的delete
代码的样子(这失败了(:
# Auth stuff, then...
@client.execute!(
:api_method => @youtube.videos.delete,
:parameters => {
'id' => youtube_id,
}
)
我错过了什么?不幸的是,用于删除的 YouTube API 文档没有提供任何示例,所以我没有什么可比较的。请告诉我是否有进一步的信息,以使我的问题更清晰。
我很确定这个问题的所有 11 个观点(截至撰写本文时(都是我,但我会发布一个答案,以防将来对某人有所帮助:
我的代码本身没有问题。问题是当我最初为此帐户创建refresh_token
时。
对于外行,YouTube Data API(v3(不支持"服务帐户",在Google API生态系统的其他地方,当唯一的客户端是您自己时,通常可以完成设置OAuth2身份验证客户端的方式。解决方法是您必须手动完成的操作。执行以下步骤:
首先,转到谷歌"API 控制台"。在那里,在"API 访问"下,您需要为"已安装的应用程序"创建客户端 ID"。这将为您提供一个Client ID
,一个Client secret
和一个Redirect URI
(您需要非localhost
的(。把这些写下来。
接下来,您需要通过访问您喜欢的 Web 浏览器中的 URL 来手动获取授权代码,同时登录到您刚刚为其创建客户端 ID 的同一帐户:
https://accounts.google.com/o/oauth2/auth
?client_id={client_id}
&redirect_uri={redirect_uri}
&scope={space separated scopes}
&response_type=code
&access_type=offline
当然,您需要输入client_id
、redirect_uri
和scope
查询参数。就我而言,这就是我出错的地方。当我执行此手动步骤时,我应该将scope
参数设置为:
https://www.googleapis.com/auth/youtube https://www.googleapis.com/auth/youtube.upload
但相反,我只是做了https://www.googleapis.com/auth/youtube.upload
,这不足以更新/删除视频!
最后,您需要获取一个 refresh_token
,通过获取如下 URL:
https://accounts.google.com/o/oauth2/token
?code={authorization_code}
&client_id={client_id}
&client_secret={client_secret}
&redirect_uri={redirect_uri}
&grant_type=authorization_code
并用如下命令将其卷曲:
$ curl https://accounts.google.com/o/oauth2/token -d "code=..."
这将返回一个包含您的refresh_token
的 JSON 响应,然后您在通过 Google API 以编程方式授权您的请求时使用该响应。
注意 我们现在是 2022 年,如果您使用的是 Node.js 或任何其他语言,您至少需要包含一个 youtube 授权范围,我只是熟悉 node.js 只
。例如 https://www.googleapis.com/auth/youtube 了解更多信息,请查看YouTube官方文档