带有 OAuth2 的 YouTube API v3:更新和删除失败并出现“权限不足”错误

Posted

技术标签:

【中文标题】带有 OAuth2 的 YouTube API v3:更新和删除失败并出现“权限不足”错误【英文标题】:YouTube API v3 with OAuth2: update and delete fail with "Insufficient Permission" error 【发布时间】:2013-10-08 05:49:39 【问题描述】:

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

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】:

我相当确定这个问题的所有 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_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,通过这样的 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=..."

这将返回一个 JSON 响应,其中包含您的 refresh_token,然后您在通过 Google API 以编程方式授权您的请求时使用该响应。

【讨论】:

这是另一种生成刷新令牌以插入您的代码的方法:youtube.com/watch?v=hfWe1gPCnzc 请问有类似问题Uploading video to YouTube and adding it to playlist using YouTube Data API v3 in Python吗? 我遇到了同样的错误,但要更新,您需要添加读写 ssl 范围。从此链接引用:developers.google.com/youtube/v3/docs/videos/update

以上是关于带有 OAuth2 的 YouTube API v3:更新和删除失败并出现“权限不足”错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 YouTube API 播放带有开始和结束时间的 YouTube 视频

YouTube api v3 调试 oauth2 访问令牌

重复使用 Oauth2 凭据来访问 YouTube api [关闭]

使用 Youtube Api v3 和 oauth2 将视频上传到我的 Youtube 频道,无需用户身份验证

YouTube API - Oauth2 流程(OSGI 捆绑包)

使用 YouTube API 从带有 JSON 提要的视频中获取所有评论