我正在尝试使用 YouTube API v3 来更新
和删除
视频与 OAuth2 for authentication通过 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
,因此,我再次认为,这不是问题所在。
为了比较,这是我的插入
(上传)代码的样子(有效):
# 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 documentation for delete没有提供任何例子,所以我没有什么可以比较的。如果我可以提供更多信息以使我的问题更清楚,请告诉我。
最佳答案
我相当确定这个问题的所有 11 个观点(截至撰写本文时)都是我,但我将发布一个答案以防它在将来对某人有所帮助:
我的代码本身没有问题。问题出在我最初为此帐户创建 refresh_token
时。
对于外行来说,YouTube 数据 API (v3) 不支持“服务帐户”,在 Google API 生态系统的其他地方,这是您通常完成设置 OAuth2 授权客户端的方式,当唯一的客户端是你自己。解决方法是您必须手动。请执行以下步骤:
首先,转到 Google“API 控制台”。在“API 访问”下,您需要为“已安装的应用程序”“创建客户端 ID”。这将为您提供一个 Client ID
、一个 Client secret
和一个 Redirect URI
(您需要非 localhost
一个)。把这些写下来。
接下来,您需要手动获取授权码,方法是在您最喜欢的网络浏览器中访问如下 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 它:
$ curl https://accounts.google.com/o/oauth2/token -d "code=..."
这将返回一个包含您的 refresh_token
的 JSON 响应,您随后可以在通过 Google API 以编程方式授权您的请求时使用它。
关于ruby - 带有 OAuth2 : update and delete fail with "Insufficient Permission" error 的 YouTube API v3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19126857/