使用 OAuth 2.0 访问 Google API

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

首先,从 Google API Console 获取 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 Console获取 OAuth 2.0 凭据。

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

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

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

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

可通过多种方式提出此请求,并且根据您正在构建的应用类型,这些方法会有所不同。例如,JavaScript 应用可能会使用浏览器重定向到 Google 来请求访问令牌,而安装在没有浏览器的设备上的应用会使用网络服务请求。

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

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

最佳做法一般是在需要访问权限时逐步请求作用域,而不是预先请求。例如,如果应用想要支持将活动保存到日历,那么除非用户按“添加到日历”按钮,否则不应请求 Google 日历访问权限;请参阅增量授权

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

将访问令牌响应中包含的范围与访问应用的特性和功能所需的范围进行比较(具体取决于对相关 Google API 的访问权限)。停用您的应用的任何功能,这些功能必须访问相关 API 才能正常运行。

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

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

应用获得访问令牌后,它会通过 HTTP Authorization 请求标头将令牌发送到 Google API。您可以将令牌作为 URI 查询字符串参数发送,但我们不建议这样做,因为 URI 参数最终可能会出现在并非完全安全的日志文件中。此外,在 REST 方法中最好不要创建不必要的 URI 参数名称。

访问令牌仅对令牌请求的 scope 中描述的一组操作和资源有效。例如,如果为 Google Calendar API 发出了访问令牌,则它不会授予对 Google Contacts API 的访问权限。但是,您可以将该访问令牌多次发送到 Google Calendar API 以进行类似操作。

5. 如有必要,请刷新访问令牌。

访问令牌的生命周期是有限的。如果您的应用需要访问的 Google API 超出了单个访问令牌的生命周期,则可以获取刷新令牌。刷新令牌可让您的应用获取新的访问令牌。

场景

Web 服务器应用

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

当您的应用将浏览器重定向到某个 Google 网址时,授权序列便会开始;该网址包含会指示所请求访问类型的查询参数。Google 会处理用户身份验证、会话选择和用户意见征求方面的工作。应用将获得一个授权代码,用它来换取访问令牌和刷新令牌。

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

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

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

已安装的应用

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

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

当您的应用将浏览器重定向到某个 Google 网址时,授权序列便会开始;该网址包含会指示所请求访问类型的查询参数。Google 会处理用户身份验证、会话选择和用户意见征求方面的工作。应用将获得一个授权代码,用它来换取访问令牌和刷新令牌。

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

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

如需了解详情,请参阅 对已安装的应用使用 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 网址发出授权码的网络服务请求。响应包含多个参数,包括网址和应用向用户显示的代码。

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

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

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

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

服务账号

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

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

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

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

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

令牌大小

令牌的大小可以各不相同,但不得超过以下限制:

  • 授权代码:256 字节
  • 访问令牌:2048 字节
  • 刷新令牌: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 等效项)。

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

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

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

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

GCP 组织的管理员在用户访问 GCP 资源时,可能需要频繁地使用 Google Cloud 会话控制功能重新对用户进行身份验证。此政策会影响对 Google Cloud 控制台、Google Cloud SDK(也称为 gcloud CLI)以及任何需要 Cloud Platform 范围的第三方 OAuth 应用的访问。如果用户设有会话控制政策,那么在会话时长到期时,您的 API 调用将会出错,类似于刷新令牌被撤消时会发生的情况 - 调用将失败,错误类型为 invalid_granterror_subtype 字段可用于区分已撤消的令牌和由于会话控制政策导致的失败(例如 "error_subtype": "invalid_rapt")。由于会话时长必须完全限制在 4 小时到 4 小时内。

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

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

客户端库

以下客户端库与热门框架集成,因而简化了 OAuth 2.0 实现。我们会随着时间的推移向库中添加更多功能。