适用于移动应用和桌面应用的 OAuth 2.0

< < - < 1 - < 1 - < 1 - < < 1 - < - < < < 1 - < 1 - < < 1 - < 1 - < < 1 - < 1 - < - < < 1 - < - < < 1 - < < 1 - < - < < > - < < 1 - < < 1 - < < 1 - < < 1 - < < 1 - < - <

本文档介绍了安装在手机、平板电脑和计算机等设备上的应用如何使用 Google 的 OAuth 2.0 端点授予对 YouTube Data API 的访问权限。

OAuth 2.0 允许用户与应用共享特定数据,同时保持其用户名、密码和其他信息的私密性。例如,应用可以使用 OAuth 2.0 来获得检索频道的 YouTube 数据的权限。

已安装的应用会分发到各个设备,并假设这些应用无法保守机密。它们可以在用户正在使用应用或当应用在后台运行时访问 Google API。

此授权流程类似于网络服务器应用使用的授权流程。主要区别在于,已安装的应用必须打开系统浏览器并提供一个本地重定向 URI,以处理来自 Google 授权服务器的响应。

替代方案

对于移动应用,您可能希望使用 AndroidiOS 版 Google 登录。Google 登录客户端库可处理身份验证和用户授权,并且可能比此处介绍的较低级别的协议更容易实现。

对于在不支持系统浏览器或输入功能有限的设备(例如电视、游戏机、相机或打印机)上运行的应用,请参阅适用于电视和设备的 OAuth 2.0在电视和受限输入设备上登录

库和示例

我们建议您使用以下库和示例来帮助您实现本文档中所述的 OAuth 2.0 流程:

前提条件

为您的项目启用 API

任何调用 Google API 的应用都需要在 API Console中启用这些 API。

如需为您的项目启用该 API,请按以下步骤操作:

  1. Open the API Library (在 Google API Console中)。
  2. If prompted, select a project, or create a new one.
  3. 使用“库”页面找到并启用 YouTube Data API。查找您的应用将使用的任何其他 API,并启用这些 API。

创建授权凭据

任何使用 OAuth 2.0 访问 Google API 的应用都必须具有授权凭据,用于向 Google 的 OAuth 2.0 服务器标识应用。以下步骤说明了如何为项目创建凭据。然后,您的应用可以使用这些凭据访问您已为该项目启用的 API。

  1. Go to the Credentials page.
  2. 依次点击创建凭据 > OAuth 客户端 ID
  3. 以下部分介绍了 Google 授权服务器支持的客户端类型和重定向方法。选择为您的应用推荐的客户端类型,为您的 OAuth 客户端命名,然后根据需要设置表单中的其他字段。
Android
  1. 选择 Android 应用类型。
  2. 输入 OAuth 客户端的名称。此名称显示在项目的 Credentials page 上,用于识别客户端。
  3. 输入 Android 应用的软件包名称。此值由应用清单文件的 <manifest> 元素的 package 属性定义。
  4. 输入应用分发的 SHA-1 签名证书指纹。
    • 如果您的应用使用 Google Play 应用签名,请从 Play 管理中心的“应用签名”页面复制 SHA-1 指纹。
    • 如果您自行管理密钥库和签名密钥,则可使用 Java 附带的 keytool 实用程序以人类可读的格式输出证书信息。复制 keytool 输出的 Certificate fingerprints 部分中的 SHA1 值。如需了解详情,请参阅 Android 版 Google API 文档中的对客户端进行身份验证
  5. (可选)验证 Android 应用的所有权
  6. 点击创建
iOS
  1. 选择 iOS 应用类型。
  2. 输入 OAuth 客户端的名称。此名称显示在项目的 Credentials page 上,用于识别客户端。
  3. 输入应用的软件包标识符。软件包 ID 是应用的信息属性列表资源文件 (info.plist) 中 CFBundleIdentifier 键的值。该值最常显示在 Xcode 项目编辑器的“General”窗格或“Signing & Capabilities”窗格中。软件包 ID 还会显示在 Apple 的 App Store Connect 网站上相应应用的“应用信息”页面的“常规信息”部分。
  4. (可选)

    如果您的应用已在 Apple 的 App Store 中发布,请输入其 App Store ID。商店 ID 是每个 Apple App Store 网址中包含的数字字符串。

    1. 在 iOS 或 iPadOS 设备上打开 Apple App Store 应用
    2. 搜索您的应用。
    3. 选择“分享”按钮(正方形和向上箭头符号)。
    4. 选择复制链接
    5. 将链接粘贴到文本编辑器中。App Store ID 是网址的最后一部分。

      示例:https://apps.apple.com/app/google/id284815942

  5. (可选)

    输入您的团队 ID。如需了解详情,请参阅 Apple 开发者帐号文档中的查找您的团队 ID

  6. 点击创建
UWP
  1. 选择通用 Windows 平台应用类型。
  2. 输入 OAuth 客户端的名称。此名称显示在项目的 Credentials page 上,用于识别客户端。
  3. 输入应用的 12 个字符的 Microsoft Store ID。您可以在 Microsoft 合作伙伴中心的“应用管理”部分的应用身份页面上找到此值。
  4. 点击创建

对于 UWP 应用,自定义 URI scheme 不得超过 39 个字符。

自定义 URI scheme(Android、iOS、UWP)

自定义 URI scheme 是一种深层链接形式,它使用自定义 scheme 打开您的应用。

在 Android 上使用自定义 URI 架构的替代方案

使用适用于 Android 的 Google 登录 SDK,它会直接向您的应用提供 OAuth 2.0 响应,这样便无需使用重定向 URI。

如何迁移到 Android 版 Google 登录 SDK

如果您目前在 Android 上使用自定义架构进行 OAuth 集成,则需要完成以下操作,才能完全迁移到使用推荐的 Android 版 Google 登录 SDK:

  1. 更新代码以使用 Google 登录 SDK。
  2. 在 Google API 控制台中停用对自定义架构的支持。

如需迁移到 Google 登录 Android SDK,请按以下步骤操作:

  1. 更新您的代码,以使用 Google 登录 Android SDK:
    1. 检查您的代码,确定您要在哪里向 Google 的 OAuth 2.0 服务器发送请求;如果使用的是自定义架构,您的请求将如下所示:
        https://accounts.google.com/o/oauth2/v2/auth?
        scope=<SCOPES>&
        response_type=code&
        &state=<STATE>&
        redirect_uri=com.example.app:/oauth2redirect&
        client_id=<CLIENT_ID>
        
      com.example.app:/oauth2redirect 是上例中的自定义架构重定向 URI。请参阅 redirect_uri 参数定义,详细了解自定义 URI 架构值的格式。
    2. 记下您在配置 Google 登录 SDK 时需要用到的 scopeclient_id 请求参数。
    3. 按照 开始将 Google 登录功能集成到您的 Android 应用中的说明设置 SDK。您可以跳过获取后端服务器的 OAuth 2.0 客户端 ID 步骤,因为您会重复使用从上一步中检索到的 client_id
    4. 按照 启用服务器端 API 访问权限说明进行操作。具体步骤如下:
      1. 使用 getServerAuthCode 方法为要请求权限的范围检索授权代码。
      2. 将身份验证代码发送到应用的后端,以用其交换访问和刷新令牌。
      3. 使用检索到的访问令牌代表用户调用 Google API。
  2. 在 Google API 控制台中停用对自定义架构的支持:
    1. 前往 OAuth 2.0 凭据列表,然后选择您的 Android 客户端。
    2. 转到高级设置部分,取消选中启用自定义 URI 架构复选框,然后点击保存以停用自定义 URI 架构支持。
启用自定义 URI scheme
如果推荐的替代方案不起作用,您可以按照以下说明为 Android 客户端启用自定义 URI scheme:
  1. 前往 OAuth 2.0 凭据列表,然后选择您的 Android 客户端。
  2. 转到高级设置部分,选中启用自定义 URI 架构复选框,然后点击保存以启用自定义 URI 架构支持。
在 Chrome 应用中使用自定义 URI scheme 的替代方案

使用 Chrome Identity API,它会直接向您的应用提供 OAuth 2.0 响应,这样便无需使用重定向 URI。

验证应用所有权(Android、Chrome)

您可以验证对应用的所有权,以降低应用被假冒的风险。

Android

为了完成验证流程,您可以使用自己的 Google Play 开发者帐号(如果有),并在 Google Play 管理中心内注册了您的应用。要成功验证,必须满足以下要求:

  • 您必须在 Google Play 管理中心内有一个已注册的应用,该应用的软件包名称和 SHA-1 签名证书指纹与您要为其完成验证的 Android OAuth 客户端相同。
  • 您必须在 Google Play 管理中心内拥有该应用的管理员权限。 详细了解 Google Play 管理中心内的访问权限管理。

在 Android 客户端的验证应用所有权部分中,点击验证所有权按钮以完成验证流程。

如果验证成功,系统会显示一条通知,确认验证流程成功。否则,系统会显示错误提示。

要解决验证失败的问题,请尝试以下操作:

  • 确保您要验证的应用是 Google Play 管理中心内已注册的应用。
  • 确保您在 Google Play 管理中心内拥有该应用的管理员权限。
Chrome

若要完成验证流程,请使用您的 Chrome 应用商店开发者账号。 要成功通过验证,必须满足以下要求:

  • 您必须在 Chrome 应用商店开发者信息中心注册一个产品,并且其产品 ID 与您为其完成验证的 Chrome 扩展程序 OAuth 客户端的 ID 相同。
  • 您必须是 Chrome 应用商店内容的发布商。 详细了解 Chrome 应用商店开发者信息中心内的访问权限管理。

在 Chrome 扩展程序客户端的验证应用所有权部分中,点击验证所有权按钮以完成验证流程。

注意:授予对您账号的访问权限后,请等待几分钟,然后再完成验证流程。

如果验证成功,系统会显示一条通知,确认验证流程成功。否则,系统会显示错误提示。

要解决验证失败的问题,请尝试以下操作:

  • 确保 Chrome 应用商店开发者信息中心内有一个已注册的项目,其项目 ID 与您为其完成验证的 Chrome 扩展程序 OAuth 客户端的 ID 相同。
  • 请确保您是该应用的发布者,即您必须是该应用的个人发布者或该应用群组发布者的成员。在 Chrome 应用商店开发者信息中心内详细了解访问权限管理。
  • 如果您刚刚更新了群组发布者列表,请验证群组发布者成员资格列表是否已在 Chrome 应用商店开发者信息中心内同步。详细了解如何同步您的发布商成员资格列表。

环回 IP 地址(macOS、Linux、Windows 桌面设备)

如需使用此网址接收授权代码,您的应用必须监听本地网络服务器。许多平台(但并非所有平台)都能做到这一点。不过,如果您的平台支持,则建议您使用此机制来获取授权代码。

当您的应用收到授权响应时,为实现最佳易用性,它应该显示一个 HTML 页面来指示用户关闭浏览器并返回您的应用。

推荐用法 macOS、Linux 和 Windows 桌面(但不包括通用 Windows 平台)应用
表单值 将应用类型设置为桌面应用

手动复制/粘贴

确定访问权限范围

借助范围,您的应用可以仅请求访问所需的资源,同时用户还可以控制他们向您的应用授予的访问权限大小。因此,请求的范围数量与征得用户同意的可能性之间可能存在反向关系。

在开始实现 OAuth 2.0 授权之前,我们建议您确定应用需要访问权限的范围。

YouTube Data API v3 使用以下范围:

瞄准镜
https://www.googleapis.com/auth/youtube管理您的 YouTube 帐号
https://www.googleapis.com/auth/youtube.channel-memberships.creator查看包含以下信息的列表:当前活跃的频道会员、其当前级别以及其成为会员的时间
https://www.googleapis.com/auth/youtube.force-ssl查看、修改以及永久删除您的 YouTube 视频、评分、评论和字幕
https://www.googleapis.com/auth/youtube.readonly查看您的 YouTube 帐号
https://www.googleapis.com/auth/youtube.upload管理您的 YouTube 视频
https://www.googleapis.com/auth/youtubepartner查看和管理您在 YouTube 上的资源和关联内容
https://www.googleapis.com/auth/youtubepartner-channel-audit查看您的 YouTube 频道中关于 YouTube 合作伙伴试演的隐私信息

OAuth 2.0 API 范围文档包含可用于访问 Google API 的范围的完整列表。

获取 OAuth 2.0 访问令牌

以下步骤展示了您的应用如何与 Google 的 OAuth 2.0 服务器交互,以征得用户同意,从而代表用户执行 API 请求。您的应用必须先获得用户授权,然后才能执行需要用户授权的 Google API 请求。

第 1 步:生成代码验证程序和验证代码

Google 支持代码交换证明密钥 (PKCE) 协议,可使安装式应用流更加安全。系统会为每个授权请求创建一个唯一的代码验证程序,并将其转换后的值“code_challenge”发送到授权服务器以获取授权代码。

创建代码验证程序

code_verifier 是使用非预留字符 [A-Z] / [a-z] / [0-9] /“-”/“.”/“_”/“~”的高熵加密随机字符串,最小长度为 43 个字符,最大长度为 128 个字符。

代码验证程序应具有足够的熵,以使猜测值不切实际。

创建代码质询

支持两种创建代码质询的方法。

代码验证生成方法
S256(推荐) 代码质询是代码验证程序的 Base64网址(无填充)编码 SHA256 哈希。
code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
纯色 代码质询与上面生成的代码验证程序相同的值。
code_challenge = code_verifier

第 2 步:向 Google 的 OAuth 2.0 服务器发送请求

如需获得用户授权,请通过 https://accounts.google.com/o/oauth2/v2/auth 向 Google 授权服务器发送请求。此端点会处理活跃会话查询、对用户进行身份验证,以及征求用户意见。端点只能通过 SSL 访问,并且会拒绝 HTTP(非 SSL)连接。

对于已安装的应用,授权服务器支持以下查询字符串参数:

参数
client_id 必需

应用的客户端 ID。您可以在 API Console Credentials page中找到此值。

redirect_uri 必填

确定 Google 的授权服务器如何向您的应用发送响应。有多个重定向选项可供已安装的应用使用,您在设置授权凭据时需要记住特定的重定向方法。

该值必须与您在客户端的 API Console Credentials page中配置的 OAuth 2.0 客户端的某个已授权重定向 URI 完全匹配。如果此值与已获授权的 URI 不匹配,则您会收到 redirect_uri_mismatch 错误。

下表显示了每种方法对应的 redirect_uri 参数值:

redirect_uri
自定义 URI scheme com.example.app:redirect_uri_path

com.googleusercontent.apps.123:redirect_uri_path
  • com.example.app 是您所控制网域的反向 DNS 表示法。自定义架构必须包含句点才有效。
  • com.googleusercontent.apps.123 是客户端 ID 的反向 DNS 表示法。
  • redirect_uri_path 是可选路径组件,例如 /oauth2redirect。请注意,路径应以单个斜杠开头,这与常规 HTTP 网址不同。
环回 IP 地址 http://127.0.0.1:porthttp://[::1]:port

在您的平台中查询相关的环回 IP 地址,并在随机可用端口上启动 HTTP 监听器。将 port 替换为应用监听的实际端口号。

请注意,移动应用对环回 IP 地址重定向选项的支持 已弃用

response_type 必填

确定 Google OAuth 2.0 端点是否返回授权代码。

对于已安装的应用,请将此参数的值设置为 code

scope 必需

以空格分隔的范围列表,用于标识应用可以代表用户访问的资源。这些值会告知 Google 向用户显示的同意屏幕。

借助范围,您的应用可以仅请求访问所需的资源,同时用户还可以控制他们向您的应用授予的访问权限大小。因此,请求的范围数量与征得用户同意的可能性之间是相反的。

YouTube Data API v3 使用以下范围:

瞄准镜
https://www.googleapis.com/auth/youtube管理您的 YouTube 帐号
https://www.googleapis.com/auth/youtube.channel-memberships.creator查看包含以下信息的列表:当前活跃的频道会员、其当前级别以及其成为会员的时间
https://www.googleapis.com/auth/youtube.force-ssl查看、修改以及永久删除您的 YouTube 视频、评分、评论和字幕
https://www.googleapis.com/auth/youtube.readonly查看您的 YouTube 帐号
https://www.googleapis.com/auth/youtube.upload管理您的 YouTube 视频
https://www.googleapis.com/auth/youtubepartner查看和管理您在 YouTube 上的资源和关联内容
https://www.googleapis.com/auth/youtubepartner-channel-audit查看您的 YouTube 频道中关于 YouTube 合作伙伴试演的隐私信息

OAuth 2.0 API 范围文档提供了可用于访问 Google API 的范围的完整列表。

code_challenge 建议

指定一个已编码的 code_verifier,用于在授权代码交换期间用作服务器端验证。如需了解详情,请参阅上面的创建代码质询部分。

code_challenge_method 建议

指定用于编码在授权代码交换期间使用的 code_verifier 的方法。此参数必须与上述 code_challenge 参数一起使用。如果包含 code_challenge 的请求中不存在 code_challenge_method 的值,则其值默认为 plain。此参数仅支持 S256plain 值。

state 建议

指定您的应用用于维护授权请求与授权服务器响应之间的状态的任何字符串值。在用户同意或拒绝应用的访问请求后,服务器会返回您在 redirect_uri 的网址片段标识符 (#) 中以 name=value 对的形式发送的确切值。

您可以将此参数用于多种用途,例如将用户定向到应用中的正确资源、发送 Nonce,以及缓解跨网站请求伪造问题。由于您的 redirect_uri 可以被猜出,因此使用 state 值可以提高传入连接是身份验证请求结果的可能性。如果您生成随机字符串或者对 Cookie 或其他用于捕获客户端状态的值进行编码,则可以验证响应,以进一步确保请求和响应来自同一浏览器,从而防范跨站请求伪造等攻击。如需查看有关如何创建和确认 state 令牌的示例,请参阅 OpenID Connect 文档。

login_hint 可选

如果您的应用知道哪个用户正在尝试进行身份验证,则可以使用此参数向 Google 身份验证服务器提供提示。服务器会根据该提示来简化登录流程,方法是在登录表单中预填充电子邮件地址字段,或者选择相应的多登录会话。

将参数值设置为电子邮件地址或 sub 标识符,相当于用户的 Google ID。

授权网址示例

以下标签页显示了不同重定向 URI 选项的授权网址示例。

每个网址请求访问一个范围,该范围允许检索用户的 YouTube 数据。

除了 redirect_uri 参数的值外,这些网址完全相同。这些网址还包含必需的 response_typeclient_id 参数以及可选的 state 参数。为便于阅读,每个网址都包含换行符和空格。

自定义 URI scheme

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.force-ssl&
 response_type=code&
 state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken&
 redirect_uri=com.example.app%3A/oauth2redirect&
 client_id=client_id

环回 IP 地址

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.force-ssl&
 response_type=code&
 state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken&
 redirect_uri=http%3A//127.0.0.1%3A9004&
 client_id=client_id

第 3 步:Google 提示用户同意

在此步骤中,用户可决定是否授予您的应用所请求的访问权限。在此阶段,Google 会显示一个权限请求窗口,其中会显示应用的名称、请求使用用户的授权凭据进行访问的 Google API 服务的名称,以及要授予的访问权限范围的摘要。然后,用户可以同意授予对您的应用请求的一个或多个范围的访问权限,也可以拒绝该请求。

在此阶段,您的应用会等待来自 Google OAuth 2.0 服务器的响应,指示是否已授予任何访问权限。以下步骤将介绍该响应。

错误

向 Google 的 OAuth 2.0 授权端点发出的请求可能会显示面向用户的错误消息,而不是预期的身份验证和授权流程。下面列出了常见的错误代码和建议的解决方案。

admin_policy_enforced

根据其 Google Workspace 管理员的政策,该 Google 账号无法向所请求的一个或多个范围授权。请参阅 Google Workspace 管理员帮助文章 控制哪些第三方应用和内部应用可以访问 Google Workspace 数据,详细了解在将您的 OAuth 客户端 ID 明确授予访问权限之前,管理员如何限制对所有范围或敏感范围和受限范围的访问权限。

disallowed_useragent

授权端点显示在 Google 的 OAuth 2.0 政策禁止的嵌入式用户代理内。

Android

Android 开发者在 android.webkit.WebView 中打开授权请求时可能会遇到此错误消息。开发者应改用 Android 库,例如 Google 登录(Android 版)或 OpenID Foundation 的 AppAuth(Android 版)

当 Android 应用在嵌入式用户代理中打开常规网页链接,并且用户从您的网站导航到 Google 的 OAuth 2.0 授权端点时,Web 开发者可能会遇到此错误。开发者应允许在操作系统的默认链接处理程序(包括 Android App Links 处理程序或默认浏览器应用)中打开常规链接。系统也支持 Android 自定义标签页库。

iOS

WKWebView 中打开授权请求时,iOS 和 macOS 开发者可能会遇到此错误。开发者应改用 iOS 库,例如 Google 登录(iOS 版)或 OpenID Foundation 的 AppAuth(iOS 版)

当 iOS 或 macOS 应用在嵌入式用户代理中打开常规网页链接,并且用户从您的网站导航到 Google 的 OAuth 2.0 授权端点时,Web 开发者可能会遇到此错误。开发者应允许在操作系统的默认链接处理程序(包括通用链接处理程序或默认浏览器应用)中打开常规链接。SFSafariViewController 库也是一个受支持的选项。

org_internal

请求中的 OAuth 客户端 ID 属于某个项目,该项目限制对特定 Google Cloud 组织中的 Google 账号的访问权限。如需详细了解此配置选项,请参阅“设置 OAuth 权限请求”帮助文章中的用户类型部分。

invalid_grant

如果您使用的是代码验证程序和验证,则 code_callenge 参数无效或缺失。确保 code_challenge 参数设置正确。

刷新访问令牌时,令牌可能已过期或已失效。 再次对用户进行身份验证,并请求用户同意以获取新令牌。如果您仍然看到此错误消息,请确保您的应用已正确配置,且您在请求中使用了正确的令牌和参数。否则,用户账号可能已被删除或停用。

redirect_uri_mismatch

授权请求中传递的 redirect_uri 与 OAuth 客户端 ID 的授权重定向 URI 不匹配。在 Google API Console Credentials page中查看已获授权的重定向 URI。

传递的 redirect_uri 对于客户端类型可能无效。

redirect_uri 参数可能是指已弃用且不再受支持的 OAuth 带外 (OOB) 流程。如需更新您的集成,请参阅迁移指南

invalid_request

您提出的请求出了点问题。造成这种情况的原因有很多:

  • 该请求的格式不正确
  • 请求缺少必需的参数
  • 请求使用的授权方法不受 Google 支持。验证您的 OAuth 集成是否使用了推荐的集成方法
  • 重定向 URI 使用自定义架构:如果您看到错误消息 Chrome 应用不支持自定义 URI 架构您的 Android 客户端尚未启用自定义 URI 架构,则表示您使用的自定义 URI 架构在 Chrome 应用中不受支持,且在 Android 设备上默认处于停用状态。详细了解自定义 URI scheme 替代方案

第 4 步:处理 OAuth 2.0 服务器响应

应用接收授权响应的方式取决于其使用的重定向 URI 架构。无论采用何种 scheme,响应都会包含授权代码 (code) 或错误 (error)。例如,error=access_denied 表示用户拒绝了请求。

如果用户向您的应用授予访问权限,您可以按照下一步中的说明,用授权代码来换取访问令牌和刷新令牌。

第 5 步:交换刷新令牌和访问令牌的授权代码

如需将授权代码换成访问令牌,请调用 https://oauth2.googleapis.com/token 端点并设置以下参数:

字段
client_id 从 API Console Credentials page获取的客户端 ID。
client_secret Credentials page API Console获取的客户端密钥。
code 从初始请求返回的授权代码。
code_verifier 您在第 1 步中创建的代码验证程序。
grant_type 如 OAuth 2.0 规范中所定义,此字段的值必须设置为 authorization_code
redirect_uri 在给定 client_id 的 API Console Credentials page 中为您的项目列出的其中一个重定向 URI。

以下代码段显示了一个示例请求:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your_client_id&
client_secret=your_client_secret&
redirect_uri=http://127.0.0.1:9004&
grant_type=authorization_code

Google 通过返回一个 JSON 对象(其中包含短期有效的访问令牌和刷新令牌)来响应此请求。

响应包含以下字段:

字段
access_token 您的应用为授权 Google API 请求而发送的令牌。
expires_in 访问令牌的剩余生命周期(以秒为单位)。
id_token 注意:仅当您的请求包含身份范围(例如 openidprofileemail)时,系统才会返回此属性。此标记的值是一个 JSON 网络令牌 (JWT),其中包含有关用户经过数字签名的身份信息。
refresh_token 可用于获取新访问令牌的令牌。刷新令牌在用户撤消访问权限之前一直有效。请注意,始终会为已安装的应用返回刷新令牌。
scope access_token 授予的访问权限范围,表示为一个以空格分隔的区分大小写的字符串列表。
token_type 返回的令牌类型。目前,此字段的值始终设置为 Bearer

以下代码段显示了一个示例响应:

{
  "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in": 3920,
  "token_type": "Bearer",
  "scope": "https://www.googleapis.com/auth/youtube.force-ssl",
  "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
}

调用 Google API

在您的应用获取访问令牌后,如果已授予某个 Google API 所需的访问权限范围,您就可以使用该令牌代表给定用户账号调用该 API。为此,请在对 API 的请求中添加访问令牌,方法是添加 access_token 查询参数或 Authorization HTTP 标头 Bearer 值。如果可能,最好使用 HTTP 标头,因为查询字符串往往显示在服务器日志中。在大多数情况下,您可以使用客户端库来设置对 Google API 的调用(例如,在调用 YouTube Live Streaming API 时)。

请注意,YouTube Live Streaming API 不支持服务账号流程。由于无法将服务账号与 YouTube 账号相关联,因此尝试通过此流程为请求授权将会产生 NoLinkedYouTubeAccount 错误。

您可以在 OAuth 2.0 Playground 中试用所有 Google API 并查看其范围。

HTTP GET 示例

使用 Authorization: Bearer HTTP 标头来调用 liveBroadcasts.list 端点 (YouTube Live Streaming API) 可能如下所示。请注意,您需要指定自己的访问令牌:

GET /youtube/v3/liveBroadcasts?part=id%2Csnippet&mine=true HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

以下是针对经过身份验证的用户使用 access_token 查询字符串参数对同一 API 的调用:

GET https://www.googleapis.com/youtube/v3/liveBroadcasts?access_token=access_token&part=id%2Csnippet&mine=true

curl 个示例

您可以使用 curl 命令行应用测试这些命令。以下是使用 HTTP 标头选项的示例(首选):

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/v3/liveBroadcasts?part=id%2Csnippet&mine=true

或者,也可以使用查询字符串参数选项:

curl https://www.googleapis.com/youtube/v3/liveBroadcasts?access_token=access_token&part=id%2Csnippet&mine=true

刷新访问令牌

访问令牌会定期过期,并成为相关 API 请求的无效凭据。如果您请求离线访问与访问令牌关联的范围,可以刷新访问令牌,而无需提示用户授予权限(包括在用户不在场的情况下)。

为了刷新访问令牌,您的应用会向 Google 的授权服务器 (https://oauth2.googleapis.com/token) 发送包含以下参数的 HTTPS POST 请求:

字段
client_id API Console获取的客户端 ID。
client_secret API Console获取的客户端密钥。 (client_secret 不适用于注册为 Android、iOS 或 Chrome 应用的客户端发出的请求。)
grant_type OAuth 2.0 规范中所定义,此字段的值必须设置为 refresh_token
refresh_token 从授权代码交换返回的刷新令牌。

以下代码段显示了一个示例请求:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

client_id=your_client_id&
client_secret=your_client_secret&
refresh_token=refresh_token&
grant_type=refresh_token

只要用户尚未撤消授予应用的访问权限,令牌服务器就会返回包含新访问令牌的 JSON 对象。以下代码段显示了一个示例响应:

{
  "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in": 3920,
  "scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
  "token_type": "Bearer"
}

请注意,发出的刷新令牌数量有限制;每个客户端/用户组合都有一个限制,而所有客户端中每个用户都另有一个限制。您应将刷新令牌保存到长期存储中,只要它们仍然有效,就应继续使用。如果您的应用请求的刷新令牌过多,则可能会遇到这些限制,在这种情况下,较早的刷新令牌将停止工作。

撤消令牌

在某些情况下,用户可能希望撤消授予应用的访问权限。用户可以访问 帐号设置撤消访问权限。如需了解详情,请参阅有权访问您帐号的第三方网站和应用的“撤消网站或应用访问权限”部分

应用也能够通过编程方式撤消授予其的访问权限。 如果用户退订、移除应用或应用所需的 API 资源发生了显著变化,那么程序化撤消就非常重要。换言之,移除流程的一部分可以包括一个 API 请求,用于确保移除之前授予应用的权限。

如需以编程方式撤消令牌,您的应用会向 https://oauth2.googleapis.com/revoke 发出请求,并将令牌作为参数包含在内:

curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \
        https://oauth2.googleapis.com/revoke?token={token}

令牌可以是访问令牌,也可以是刷新令牌。如果该令牌是访问令牌并且有相应的刷新令牌,则刷新令牌也会被撤消。

如果成功处理撤消,则响应的 HTTP 状态代码为 200。对于错误情况,系统将返回 HTTP 状态代码 400 以及错误代码。

延伸阅读

适用于原生应用的 OAuth 2.0 的 IETF 现行最佳做法确立了本文中介绍的许多最佳做法。