从 SafeFrame 改用 OAuth 2.0

YouTube Developer Relations – June 2013Ikai Lan

YouTube API 使用 OAuth 2.0 授权用户请求。我们经常被问及将来是否应该支持 ClientLogin 身份验证或类似 YouTube API。不过,我们从 2012 年 4 月 20 日起已正式弃用 ClientLogin,我们不打算添加此类机制。

我们认为,支持各种 OAuth 2.0 授权流程对 YouTube 用户比“ClientLogin”更有好处的原因有很多。这些流程适用于桌面应用、仅限 Web 的应用、原生移动应用,甚至是在没有复杂输入机制的电视等设备上运行的应用,而使用 ClientLogin 难以做到。此外,我们还发现,对于许多开发者来说,ClientLogin 发布后会引发更多的头痛问题,其中一些问题在我们的博文 ClientLogin #FAIL 中有所介绍。

将 OAuth 2.0 用于服务器端独立脚本

许多开发者使用 ClientLogin 授权在没有浏览器的服务器上运行的命令行脚本。使用 OAuth 2.0 时,总是会涉及到一个浏览器 - 但您正在开发一个使用 Google Play Services 通过 GoogleAuthUtil. 获取令牌的 Android 应用

仅限网站流程中,希望代表用户进行经过身份验证的 API 调用的网站必须将用户重定向到说明应用尝试访问内容的 google.com 身份验证页面。然后,Web 应用收到一个令牌,用于进行 API 调用。然后,用户可以随时使用 connected apps and sites 页面撤消应用的访问权限。

我们的 Python 代码示例演示了命令行脚本如何启动浏览器并在终端窗口中进行 API 调用,以及如何创建本地服务器以监听授权重定向后的代码,以及如何自动保存令牌以用于日后的 API 调用。下面的视频介绍了实际运作方式:

所用的令牌是一个 ASCII 字符串。如果是 offline 令牌,该令牌可移植。使用检索到的令牌,您可以在桌面上运行脚本,然后在没有 GUI 的情况下将代码复制并在远程服务器上使用,前提是代码使用相同客户端 ID 和密钥实例化 OAuth 2.0 客户端。除了 Python 之外,其他编程语言的 Google API 客户端库还提供了用于管理令牌的辅助方法,这些客户端可以在客户端之间共享,甚至可以直接在客户端标头中或作为网址参数用于较低级别的 HTTP 库中。

下面列举了一些使用离线令牌的服务器端脚本:

  • 守护进程,可监控新视频的目录,以自动将其上传到 YouTube
  • 每天使用新内容更新播放列表的 Cron 作业
  • 此脚本会通过 YouTube Analytics API 监控视频数据,并在发生特定事件(例如总观看时长超出上限)时通知频道管理员。请注意,在这种情况下,OAuth 2.0 是唯一受支持的授权方法,因为 Google Analytics(分析)API 不支持 SafeFrame。

长期访问令牌部分详细介绍了如何生成可用于服务器端进程的离线令牌。

客户端 ID 和客户端密钥最佳做法

共用同一个客户端 ID 和密钥对的任何代码都可以使用相同的访问令牌。最好只允许在组织内的机器和设备上运行的代码访问客户端 ID 和客户端密钥。

请勿将客户端 ID 和客户端密钥纳入原生移动应用代码中。所有在移动设备上进行 OAuth 2.0 身份验证的开发者都应使用“已安装的应用”客户端 ID,该客户端会要求提供额外信息来验证请求是否只来自您的团队发布的应用。

在 Android 设备上,您的应用将结合使用软件包名称和签名证书哈希来标识您的应用,而不是使用客户端 ID 和客户端密钥。在 iOS 设备上,系统会使用软件包 ID 和应用商店 ID。有关如何检索此信息的官方文档,请参阅 Google API Console 帮助页面

服务帐号与 YouTube API 不兼容

服务帐号不适用于 YouTube Data API 调用,因为服务帐号需要关联的 YouTube 频道,并且您不能将新频道或现有频道与服务帐号相关联。如果您使用服务帐号调用 YouTube Data API,则 API 服务器会返回错误,错误类型设置为 unauthorized,原因设置为 youtubeSignupRequired

离线/长期使用 YouTube API

OAuth 2.0 具有短期令牌和长期令牌。对于一次性操作,最好的选择是短期有效的访问令牌。这些令牌会在授予后不久过期。对于长时间运行的作业,您可能需要考虑获取刷新令牌,以便获取短期访问令牌。

为确保您的应用接收的是长期有效的刷新令牌,而不是短期访问令牌,请在创建客户端 ID 时使用“已安装的应用”流程,并为“已安装的应用类型”值选择 Other

建议您针对此用例使用“已安装的应用”流程。如果您需要在 Web 应用中长期使用 YouTube API,可以在初始授权请求或客户端配置中将 access_type 参数设为 offline 并将 approval_prompt 参数设为 force 以检索该值。一些客户端库将管理提取和刷新访问令牌。如果您有兴趣编写自己的自定义授权代码,不妨阅读我们在 Google 代码博客上发布的博文,这篇博文可作为编写代码的基础。

在手机、平板电脑和其他设备上使用 OAuth 2.0

编写 Android 应用时,开发者可以利用 Google Play services 处理授权详细信息。Google Play 服务为所有 Google API 提供标准授权流程,包括适用于 YouTube 平台的 API。与使用 ClientLogin 的自定义身份验证相比,此方法将为您的 Android 应用用户提供出色的体验。

在 iOS 设备上,Google 提供了两个选项:

对于旨在充当“第二屏幕”设备或没有易于使用的输入机制的电视设备,OAuth 2.0 for Devices 是首选方法。OAuth 2.0 适用于设备,在需要授权请求时向用户显示唯一的代码。此时,系统会要求用户在其他设备(例如笔记本电脑或手机)上浏览 http://google.com/device,并输入唯一代码。应用将显示一个如下所示的屏幕:

当用户在另一个设备上输入代码时,应用会定期轮询,看看是否输入了该代码。有了之后,它会检索用于进行 API 调用的令牌。要了解此操作的实际效果,请查看演示,它可在任何支持 Web 的设备上运行。该 API 本身与平台无关,因此对于没有 Web 呈现功能的设备来说很有用。我们发布了 Python 示例代码,供演示使用。

总结

OAuth 2.0 授权为需要 YouTube 授权的开发者提供了灵活性。熟悉 ClientLogin 的开发者可能会发现,将应用设置为使用 OAuth 2.0 后,还需要完成一些额外的工作才能上手,但实施 OAuth 2.0 应用后,这类应用可跨多个平台为最终用户提供更高的灵活性、安全性和易用性。

如果您对 OAuth 2.0 或本文中的任何示例还有其他疑问,请随时使用 StackOverflow 上的 youtube-api 标记进行询问。