使用 OAuth 2.0 访问 Google API

Google API 使用 OAuth 2.0 协议 进行身份验证和授权。Google 支持常见的 OAuth 2.0 用例,如网络服务器、客户端、已安装和输入受限的设备 应用用例。

首先,从 Google API 控制台获取 OAuth 2.0 客户端凭据。然后,您的客户端应用会从 Google 授权服务器请求访问令牌,从响应中提取令牌,然后将此令牌发送到您要访问的 Google API。如需查看将 OAuth 2.0 与 Google 结合使用的交互式演示(包括使用您自己的客户端凭据的选项),请试用 OAuth 2.0 Playground

本页概述了 Google 支持的 OAuth 2.0 授权场景, 并提供了指向更详细内容的链接。如需详细了解如何使用 OAuth 2.0 进行 身份验证,请参阅 OpenID Connect

基本步骤

所有应用在通过 OAuth 2.0 访问 Google API 时都遵循基本模式。概括来讲,您需要执行以下五个步骤:

1. 从 Google API 控制台获取 OAuth 2.0 凭据。

访问 Google API 控制台,获取 OAuth 2.0 凭据,例如 Google 和您的应用都知道的客户端 ID 和客户端密钥。这组值 因您构建的应用类型而异。例如,JavaScript 应用不需要密钥,但网络服务器应用需要。

您必须为应用运行的平台创建合适的 OAuth 客户端, 例如

2. 从 Google 授权服务器获取访问令牌。

您的应用必须先获取用于授予 Google API 访问权限的访问令牌,才可以使用该 API 访问非公开数据。单个访问令牌可以授予对多个 API 的不同程度的访问权限。一个名为 scope 的变量参数用于控制访问令牌允许的资源和操作集。在请求访问令牌期间, 您的应用在scope参数中发送一个或多个值。

您可以通过多种方式发出此请求,具体取决于您构建的应用类型 。例如,JavaScript 应用可能会使用 浏览器重定向到 Google 的方式请求访问令牌,而安装在没有浏览器的设备上的应用则使用 Web 服务请求。如需详细了解如何发出请求,请参阅 Scenarios以及每种应用类型的详细实现指南。

某些请求需要身份验证步骤,用户需要使用其 Google 账号登录。登录后,系统会询问用户是否愿意授予您的应用请求的一项或多项权限。此过程称为 用户同意

如果用户授予至少一项权限,Google 授权服务器会向您的 应用发送一个访问令牌(或您的应用可用于 获取访问令牌的授权代码)以及该令牌授予的访问权限范围列表。如果用户 未授予权限,服务器会返回错误。

通常,最佳做法是在需要访问权限时以增量方式请求权限范围, 而不是提前请求。例如,如果应用想要支持将活动保存到日历 ,则不应在用户按下“添加到日历”按钮之前请求 Google 日历访问权限;请参阅 增量授权

3. 检查用户授予的访问权限范围。

将访问令牌响应中包含的权限范围与访问 应用功能所需的权限范围进行比较,这些功能取决于对相关 Google API 的访问权限。停用无法在没有相关 API 访问权限的情况下运行的应用的任何功能。

即使用户授予了所有请求的权限范围,您的请求中包含的权限范围也可能与响应中包含的权限范围不匹配。如需了解访问所需的权限范围,请参阅每个 Google API 的文档。API 可以将多个权限范围字符串值映射到单个 访问权限范围,并为请求中允许的所有值返回相同的权限范围字符串。 示例:当应用请求用户授权 权限范围时,Google People API 可能会返回 https://www.googleapis.com/auth/contacts 权限范围;Google People API 方法 people.updateContact 需要授予 https://www.googleapis.com/auth/contacts 权限范围。https://www.google.com/m8/feeds/

4. 将访问令牌发送到 API。

应用获取访问令牌后,会在 HTTP 授权请求标头中将该令牌发送到 Google API。 您可以将令牌作为 URI 查询字符串参数发送,但我们不建议这样做, 因为 URI 参数最终可能会出现在不完全安全的日志文件中。此外,避免创建不必要的 URI 参数名称也是良好的 REST 实践。

访问令牌仅对令牌请求的 scope 中描述的一组操作和资源有效。例如,如果为 Google 日历 API 颁发了访问令牌,则该令牌不会授予对 Google 通讯录 API 的访问权限。不过,您可以多次将该访问令牌发送到 Google 日历 API,以执行类似的操作。

5. 根据需要刷新访问令牌。

访问令牌的生命周期是有限的。如果您的应用需要在单个访问令牌的生命周期之外访问 Google API ,则可以获取刷新令牌。借助刷新 令牌,您的应用可以获取新的访问令牌。

Scenarios

以下场景介绍了如何使用 OAuth 2.0 请求授权代码,以及如何为不同类型的应用获取 访问令牌和刷新令牌。

Web 服务器应用

Google OAuth 2.0 端点支持使用 PHP、Java、Go、Python、Ruby 和 ASP.NET 等语言和 框架的网络服务器应用。

授权序列从您的应用将浏览器重定向到 Google 网址时开始;该网址包含查询参数,用于指明所请求的访问权限类型。 Google 负责处理用户身份验证、会话选择和用户同意。结果是 授权代码,应用可以使用该代码来换取访问令牌和刷新 令牌。

应用应存储刷新令牌以供日后使用,并使用访问令牌访问 Google API。访问令牌过期后,应用会使用刷新令牌 获取新的访问令牌。

您的应用会向 Google 授权服务器发送令牌请求,接收授权代码,将该代码换成令牌,然后使用该令牌调用 Google API 端点。

如需了解详情,请参阅针对网络 服务器应用使用 OAuth 2.0

已安装的应用

Google OAuth 2.0 端点支持安装在计算机、移动设备和平板电脑等设备上的应用。通过 Google API 控制台 创建客户端 ID 时,请指定这是已安装的应用,然后选择 Android、Chrome 扩展程序、iOS 或桌面应用作为应用类型。

此过程会生成客户端 ID,在某些情况下还会生成客户端密钥,您需要将这些信息嵌入到 应用的源代码中。(在这种情况下,客户端密钥显然不会被视为密钥。)

授权序列从您的应用将浏览器重定向到 Google 网址时开始;该网址包含查询参数,用于指明所请求的访问权限类型。 Google 负责处理用户身份验证、会话选择和用户同意。结果是 授权代码,应用可以使用该代码来换取访问令牌。应用应先验证访问令牌,然后再将其包含在 Google API 请求中。当令牌过期时,应用会重复此过程。

(可选)后端服务器可以使用授权代码来换取刷新令牌,将其存储在安全的位置。访问令牌过期后,后端服务器会使用 刷新令牌为应用获取新的访问令牌。

您的应用会向 Google 授权服务器发送令牌请求,接收授权代码,将该代码换成令牌,然后使用该令牌调用 Google API 端点。

如需了解详情,请参阅为 Android 应用授权访问 Google 用户数据 以及 适用于 iOS 和桌面应用的 OAuth 2.0

客户端 (JavaScript) 应用

Google OAuth 2.0 端点支持在浏览器中运行的 JavaScript 应用。

授权序列从您的应用将浏览器重定向到 Google 网址时开始;该网址包含查询参数,用于指明所请求的访问权限类型。 Google 负责处理用户身份验证、会话选择和用户同意。

结果是访问令牌,客户端应先验证该令牌,然后再将其包含在 Google API 请求中。当令牌过期时,应用会重复此过程。

您的 JS 应用向 Google 授权服务器发送令牌请求,接收令牌,验证令牌,并使用该令牌调用 Google API 端点。

如需了解详情,请参阅针对客户端应用使用 OAuth 2.0

输入受限的设备上的应用

Google OAuth 2.0 端点支持在输入受限的设备(例如 游戏机、摄像机和打印机)上运行的应用。

授权序列从应用向 Google 网址发出 Web 服务请求以获取授权代码开始。响应包含多个参数,包括一个 网址和应用向用户显示的代码。

用户从设备获取网址和代码,然后切换到输入功能更丰富的单独设备或 计算机。用户启动浏览器,前往指定的网址,登录并输入代码。

同时,应用会按指定的时间间隔轮询 Google 网址。用户批准访问权限后,Google 服务器的响应会包含访问令牌和刷新令牌。应用应存储刷新令牌以供日后使用,并使用访问令牌访问 Google API。访问令牌过期后,应用会使用 刷新令牌获取新的访问令牌。

用户在具有浏览器的单独设备上登录

如需了解详情,请参阅针对设备使用 OAuth 2.0

服务账号

Google API(例如 Prediction API 和 Google Cloud Storage)可以代表您的 应用执行操作,而无需访问用户信息。在这种情况下,您的应用需要 向 API 证明自己的身份,但无需用户同意。同样,在 企业场景中,您的应用可以请求对某些资源的委托访问权限。

对于这些类型的服务器到服务器的互动,您需要一个服务账号,该账号 属于您的应用,而不是某个最终用户。您的 应用代表服务账号调用 Google API,无需用户同意。(在非服务账号场景中,您的应用代表 最终用户调用 Google API,有时需要用户同意。)

服务账号的凭据(您从 Google API 控制台获取)包括生成的唯一电子邮件地址、 客户端 ID 和至少一对公钥/私钥。您可以使用客户端 ID 和一个私钥来创建已签名的 JWT,并以适当的格式构建访问令牌请求。然后,您的应用会将令牌请求发送到 Google OAuth 2.0 授权服务器, 该服务器会返回访问令牌。应用使用该令牌访问 Google API。当 令牌过期时,应用会重复此过程。

您的服务器应用使用 JWT 从 Google 授权服务器请求令牌,然后使用该令牌调用 Google API 端点。不涉及任何最终用户。

如需了解详情,请参阅 服务账号文档

令牌大小

令牌的大小可能会有所不同,但不得超过以下限制:

  • code 授权代码
    256 字节
  • contextual_token 访问令牌
    2048 字节
  • restore_page 刷新令牌
    512 字节

Google Cloud 的 Security Token Service API 返回的访问令牌的结构与 Google API OAuth 2.0 访问令牌类似,但令牌大小限制不同。如需了解详情,请参阅 API 文档

Google 保留在这些限制范围内更改令牌大小的权利,您的应用 必须相应地支持可变令牌大小。

刷新令牌过期

您必须编写代码,以应对授予的刷新令牌可能 不再有效的情况。刷新令牌可能会因以下原因之一而停止工作:

如果 Google Cloud Platform 项目配置了面向外部用户的 OAuth 权限请求页面,并且发布状态为“测试”,则系统会向其颁发一个在 7 天后过期的刷新令牌,除非请求的 OAuth 权限范围仅是名称、电子邮件地址和用户个人资料(通过 userinfo.email, userinfo.profile, openid 权限范围或其 OpenID Connect 等效项)的子集。

目前,每个 OAuth 2.0 客户端 ID 的每个 Google 账号的刷新令牌数量上限为 100 个。 如果您达到此上限,则当您创建新的刷新令牌时,最旧的刷新令牌会自动失效,且系统不会显示警告。此限制不适用于 服务账号

此外,对于用户账号或 服务账号在所有客户端中拥有的刷新令牌总数,也有更大的限制。大多数普通用户不会超过此限制,但用于测试实现的开发者账号可能会超过此限制。

如果您需要授权多个程序、机器或设备,一种解决方法是 将每个 Google 账号授权的客户端数量限制为 15 或 20。如果您是 Google Workspace 管理员, 则可以创建具有管理员权限的其他用户,并使用这些用户授权 部分客户端。

处理 Google Cloud Platform (GCP) 组织的会话控制政策

GCP 组织的管理员可能会要求用户在使用 Google Cloud 会话控制 功能访问 GCP 资源时频繁重新进行身份验证。此政策会影响对 Google Cloud 控制台、 Google Cloud SDK(也称为 gcloud CLI)以及任何需要 Cloud Platform 权限范围的第三方 OAuth 应用的访问。如果用户设置了会话控制政策,则在会话时长到期时,您的 API 调用将出错,类似于刷新令牌被撤消时的情况 - 调用将失败,错误类型为 invalid_granterror_subtype 字段可用于区分撤消的令牌和因会话控制政策而导致的失败(例如 "error_subtype": "invalid_rapt")。由于会话时长可能非常有限(1 小时到 24 小时),因此必须通过重启身份验证会话来妥善处理此场景。

同样,您不得使用或鼓励使用用户凭据进行服务器到服务器的 部署。如果用户凭据部署在服务器上以执行长时间运行的作业或操作 并且客户对这些用户应用了会话控制政策,则服务器应用将 失败,因为在会话时长到期时,无法重新对用户进行身份验证。

如需详细了解如何帮助客户部署此功能,请参阅这篇 面向管理员的帮助文章。

客户端库

以下客户端库与常用框架集成,这使得实现 OAuth 2.0 更加简单。日后我们会陆续向这些库添加更多功能。