我正在使用YouTube API v3和OAuth2 for authentication通过update
Ruby gem尝试delete
和google-api-client (0.6.4)
个视频。但是,当我尝试执行这两个操作中的任何一个时,我看到以下错误消息:
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 documentation for delete没有提供任何示例,所以我没有什么可比较的。如果我能提供更多信息以便让我的问题更清楚,请告诉我。
答案 0 :(得分:13)
我很确定这个问题的所有11个观点(截至本文撰写时)都是我,但我会发布一个答案,以防万一将来有人帮助:
我的代码本身没有问题。问题是我最初为此帐户创建了refresh_token
。
对于初学者,YouTube数据API(v3)不支持“服务帐户”,在Google API生态系统的其他地方,这是您通常在唯一的客户端设置OAuth2身份验证客户端时的方式是你自己。解决方法是您必须手动执行 。采取以下步骤:
首先,转到Google“API控制台”。在“API Access”下,您需要为“已安装的应用程序”创建“客户端ID”。这将为您提供Client ID
,Client secret
和Redirect URI
(您需要非localhost
)。写下这些。
接下来,您需要手动获取授权码,方法是在您最喜欢的网络浏览器中访问如下所示的网址,同时登录到刚创建客户端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
,方法是使用以下网址:
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以编程方式授权您的请求时使用该响应。