从 YouTube ClientLogin 迁移到 OAuth 2.0

2024-03-06

我有一个应用程序,可以将视频上传到 YouTube 的特定 YouTube 频道(也就是说,不是上传到任何单个用户的频道,而是上传到单个频道,我有该频道的用户名和密码)。

在 ClientLogin 中,我的服务器端进程向 YouTube 提供了 U/P,一切都在顺利进行。然而,这已被弃用,我希望升级到 OAuth 2.0(按照他们的建议),但是,文档坚持要求用户登录时存在重定向 URI。它似乎没有解释如何绕过用户登录(因为用户没有任何可登录的内容,或任何登录凭据*使用...该应用程序旨在获取他们的视频并将其上传到我们的频道)。因此,我需要的是绕过用户被询问的任何问题,并让 YouTube 简单地获取我的频道凭据并向我返回令牌以供我进行上传。

我意识到这是一个完全标准且无争议的程序,所以我*必须遗漏一些明显的东西,但我只是无法弄清楚那是什么。

所以,我的问题是,如何跳过用户对话框 -> 重定向,只向 YouTube 提供凭据以供其接受,然后在 OAuth 2.0 中上传我的视频?

我真正想要的是遵循此处的 DirectUpload 方法:https://developers.google.com/youtube/2.0/developers_guide_protocol#AuthSub_Authentication_Flow https://developers.google.com/youtube/2.0/developers_guide_protocol#AuthSub_Authentication_Flow并在幕后默默地检索用户令牌。

TIA


(我发现)确实没有办法完全绕过访问外部页面来授权 OAuth2.0 访问。 我最接近的是在 code.google.com/apis/console 上创建一个“已安装的应用程序”项目并使用设备方法。 您将收到客户端 ID 和客户端密钥。这些稍后会用到。 理想情况下,您可以通过 code.google.com/apis/youtube/dashboard/ 生成开发人员密钥,但我认为目前不需要这样做

我对标头和响应使用 JSON 表示法,它应该很容易适应您选择的语言。

首先使用标头向accounts.google.com/o/oauth2/device/code 发出POST 请求

{
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': post_data.length,
    'X-GData-Key': 'key=YOUR_DEVELOPER_KEY'
}

以及数据包含:

{
client_id: 'YOUR_CLIENT_ID',
scope: 'https://gdata.youtube.com'
}

其中 YOUR_CLIENT_ID 是您为之前设置的 google apis 项目获取的客户端 ID。

您将得到如下响应:

{
  "device_code" : "4/Pj8m71w5XuEMTT0ZwOJVgvlTfF4Q",
  "user_code" : "5wtw67wm",
  "verification_url" : "http://www.google.com/device",
  "expires_in" : 1800,
  "interval" : 5
}

如果您在 30 分钟(每个“expires_in”响应字段 1800 秒)内没有访问 www.google.com/device(由“verification_url”字段定义),则必须再次执行第一个请求。 在 www.google.com/device 页面上,如果您尚未登录,系统会要求您登录,然后输入验证码(由“user_code”响应字段定义)。您将看到授权应用程序的请求以及应用程序请求的权限列表。 您想要存储(至少暂时)“device_code”字段的值。这将在请求访问令牌和刷新令牌时使用。

现在已授予权限,我们可以请求访问/刷新令牌对。只要您存储刷新令牌,这只需要发生一次。 要请求访问/刷新令牌对,您必须使用标头向accounts.google.com/o/oauth2/token 发出 POST 请求

{
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': post_data.length,
    'X-GData-Key': 'key=YOUR_DEVELOPER_KEY'
}

和数据

{
    client_id: 'YOUR_CLIENT_ID',
    client_secret: 'YOUR_CLIENT_SECRET',
    code: 'YOUR_DEVICE_CODE',
    grant_type: 'http://oauth.net/grant_type/device/1.0'
}

响应将如下所示

{
  "access_token" : "YOUR_ACCESS_TOKEN",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : "YOUR_REFRESH_TOKEN"
}

这指定访问令牌将在 3600 秒(60 分钟)后过期,以及您当前的访问令牌是什么以及刷新令牌是什么。 您希望存储用于当前会话的访问令牌和用于未来会话的刷新令牌。

发出 API 请求时,您需要在授权标头字段中包含访问令牌,并像我们一直以来那样包含开发人员密钥。 为了上传视频,我使用了这些标题:

{
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-GData-Key': 'key=YOUR_DEVELOPER_KEY',
    'Slug': 'video.mp4',
    'Content-Type': 'multipart/related; boundary="f897a6d"',
    'Content-Length': post_length,
    'Connection': 'close'
}

您可以随时刷新您的访问令牌,而不仅仅是在旧访问令牌过期时刷新。要刷新您的访问令牌,您可以使用标头向accounts.google.com/o/oauth2/token 发出 POST 请求

{
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': post_data.length,
    'X-GData-Key': 'key=YOUR_DEVELOPER_KEY'
}

和数据

{
    client_id: 'YOUR_CLIENT_ID',
    client_secret: 'YOUR_CLIENT_SECRET',
    refresh_token: 'YOUR_REFRESH_TOKEN',
    grant_type: 'refresh_token'
}

你会得到这样的回复

{
  "access_token" : "YOUR_NEW_ACCESS_TOKEN",
  "token_type" : "Bearer",
  "expires_in" : 3600
}

其中 YOUR_NEW_ACCESS_TOKEN 是供您在将来的请求中使用的新令牌。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 YouTube ClientLogin 迁移到 OAuth 2.0 的相关文章

随机推荐