Ikai Lan,YouTube Developer Relations – June 2013
YouTube API 使用 OAuth 2.0 对用户请求进行授权。我们经常被问到,未来是否会在 YouTube API 中添加对 ClientLogin 身份验证或类似功能的支持。不过,我们已于 2012 年 4 月 20 日正式弃用 ClientLogin,并且没有添加此类机制的计划。
我们认为,与 ClientLogin 相比,支持各种 OAuth 2.0 授权流程对 YouTube 用户更有利,原因有很多。这些流程支持桌面应用、纯 Web 应用、移动应用,甚至是在电视等没有复杂输入机制的设备上运行的应用,而使用 ClientLogin 很难做到这一点。此外,我们还发现,ClientLogin 会给许多开发者在发布后带来更多麻烦。
针对服务器端独立脚本使用 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 是唯一受支持的授权方法,因为 Analytics API 不支持 ClientLogin。
长期有效的访问令牌部分详细介绍了如何生成可用于服务器端进程的离线令牌。
客户端 ID 和客户端密钥最佳实践
共享同一客户端 ID 和密钥对的任何代码都可以使用相同的访问令牌。最好将客户端 ID 和客户端密钥的访问权限限制为仅限组织内的机器和设备上运行的代码。
请勿将客户端 ID 和客户端密钥作为原生移动应用代码的一部分。所有通过移动设备进行 OAuth 2.0 身份验证的开发者都应使用“已安装的应用”客户端 ID,该 ID 会要求提供额外信息,以验证请求是否仅来自您的团队发布的应用。

在 Android 设备上,您的应用不是使用客户端 ID 和客户端密钥进行标识,而是使用软件包名称和签名证书哈希的组合进行标识。在 iOS 设备上,系统会使用软件包 ID 和 App Store ID。如需查看有关如何检索此信息的官方文档,请访问Google Cloud 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 Code 博客上发布了一篇博文,您可以将其作为代码的基础。
在手机、平板电脑和其他设备上使用 OAuth 2.0
在编写 Android 应用时,开发者可以利用 Google Play services 来处理授权详细信息。Google Play 服务为所有 Google API(包括 YouTube 平台 API)提供标准授权流程。与使用 ClientLogin 的自定义身份验证相比,这种方法可为 Android 应用的用户提供更出色的用户体验。

在 iOS 设备上,Google 提供两种选项:
- Google+ Platform for iOS,可集成 Google 产品登录功能,还可启用社交功能
- gtm-oauth2 toolkit,用于提供授权 UIWebView 和管理令牌
对于旨在充当“第二屏幕”的设备或电视等没有易于使用的输入机制的设备,适用于设备的 OAuth 2.0 是首选方法。OAuth 2.0 for Devices 的工作原理是,在需要授权请求时,向用户显示一个唯一代码。此时,系统会要求用户在笔记本电脑或手机等其他设备上前往 http://google.com/device,然后输入相应唯一代码。应用会显示如下所示的界面:

当用户在另一台设备上输入验证码时,应用会定期轮询以查看验证码是否已输入。一旦获得授权,它就会检索用于进行 API 调用的令牌。如需查看实际效果,请查看演示,该演示可在任何支持网络的设备上运行。该 API 本身与平台无关,因此非常适合不具备 Web 呈现功能的设备。我们已发布演示的 Python 示例代码,供您参考。
摘要
OAuth 2.0 授权为需要 YouTube 授权的开发者提供了灵活性。熟悉 ClientLogin 的开发者可能会发现,设置应用以使用 OAuth 2.0 需要花费更多时间才能开始,但移植后,OAuth 2.0 应用可为最终用户提供更高的灵活性、安全性和可用性,且支持多个平台。
如果您对 OAuth 2.0 或本文中的任何示例有任何其他疑问,欢迎在 StackOverflow 上使用 youtube-api 标签提问。