带有OAuth2的YouTube API v3:更新和删除失败,其中"权限不足"错误

时间:2013-10-01 22:10:54

标签: ruby api youtube youtube-api google-api-ruby-client

我正在使用YouTube API v3OAuth2 for authentication通过update Ruby gem尝试deletegoogle-api-client (0.6.4)个视频。但是,当我尝试执行这两个操作中的任何一个时,我看到以下错误消息:

Google::APIClient::ClientError: Insufficient Permission

这是奇怪的事情:使用与updatedelete完全相同的身份验证程序,我可以成功insert(上传),没问题!所以,我认为这不是我的身份验证设置的问题,而是我代码中的其他地方。

我的读写scope在以下任何操作中始终相同:

https://www.googleapis.com/auth/youtube https://www.googleapis.com/auth/youtube.upload

根据API文档,以空格分隔的范围集应包含insertupdatedelete操作。

对于所有这些操作,我的client_idclient_secretrefresh_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没有提供任何示例,所以我没有什么可比较的。如果我能提供更多信息以便让我的问题更清楚,请告诉我。

1 个答案:

答案 0 :(得分:13)

我很确定这个问题的所有11个观点(截至本文撰写时)都是我,但我会发布一个答案,以防万一将来有人帮助:

我的代码本身没有问题。问题是我最初为此帐户创建了refresh_token

对于初学者,YouTube数据API(v3)不支持“服务帐户”,在Google API生态系统的其他地方,这是您通常在唯一的客户端设置OAuth2身份验证客户端时的方式是你自己。解决方法是您必须手动执行 。采取以下步骤:


首先,转到Google“API控制台”。在“API Access”下,您需要为“已安装的应用程序”创建“客户端ID”。这将为您提供Client IDClient secretRedirect 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_idredirect_uriscope查询参数。在我的情况下,这是我出错的地方。当我执行此手动步骤时,我应该将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以编程方式授权您的请求时使用该响应。