9

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

Google::APIClient::ClientError: Insufficient Permission

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

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

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

根据 API 文档,以空格分隔的范围集应涵盖insert,updatedelete操作。

我的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 文档没有提供任何示例,所以我没有什么可比较的。如果我可以提供更多信息以使我的问题更清楚,请告诉我。

4

2 回答 2

16

我相当确定这个问题的所有 11 个观点(截至撰写本文时)都是我,但我将发布一个答案,以防它在未来对某人有所帮助:

我的代码本身没有问题。问题是当我最初refresh_token为这个帐户创建我的时候。

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


首先,转到 Google“API 控制台”。在那里,在“API 访问”下,您需要为“已安装的应用程序”“创建客户端 ID”。这会给你 a Client ID, aClient secret和 a 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_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 以编程方式授权您的请求时使用该响应。

于 2013-10-02T17:07:41.640 回答
0

注意我们现在是 2022 年,如果您使用 Node.js 或任何其他语言,您至少需要包含一个 youtube 授权范围,我只熟悉 node.js。

例如https://www.googleapis.com/auth/youtube更多请查看youtube 官方文档

于 2022-02-26T14:17:56.480 回答