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

本文介绍了安装在手机、平板电脑和 计算机使用 Google 的 OAuth 2.0 端点来授权访问 Google API。

OAuth 2.0 允许用户与应用共享特定数据,同时 用户名、密码和其他隐私信息 例如,应用可以使用 OAuth 2.0 从 用户在 Google 云端硬盘中存储文件。

已安装的应用会分发到各个设备,并且假定这些应用 不能保守秘密。它们可以在用户使用应用期间或在以下情况下访问 Google API: 应用正在后台运行

此授权流程与 Web 服务器应用。它们的主要区别在于 要求已安装的应用必须打开系统浏览器并提供一个本地重定向 URI 来处理 Google 授权服务器的响应。

替代方案

对于移动应用,您可能希望使用 Google 登录功能: AndroidiOS。Google 登录功能 客户端库可处理身份验证和用户授权,而且可能更简单 实现比此处所述的较低级别的协议更高

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

库和示例

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

前提条件

为您的项目启用 API

任何调用 Google API 的应用都需要在 API Console。

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

  1. Open the API Library 在 Google API Console。
  2. If prompted, select a project, or create a new one.
  3. API Library 列出了所有可用的 API(按产品分组) 家庭和受欢迎程度。如果列表中没有显示您要启用的 API,请使用搜索功能 找到,或在产品系列中点击查看全部
  4. 选择您要启用的 API,然后点击启用按钮。
  5. If prompted, enable billing.
  6. If prompted, read and accept the API's Terms of Service.

创建授权凭据

任何使用 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 应用签名,请复制 SHA-1 从 Play 管理中心的“应用签名”页面获取指纹。
    • 如果您自行管理密钥库和签名密钥,请使用 keytool 实用程序 以易于用户理解的格式输出证书信息。将 SHA1Certificate fingerprints keytool 输出。请参阅 对客户端进行身份验证 适用于 Android 的 Google API 文档。
  5. (可选)验证您对 Android 设备的所有权 应用。
  6. 点击创建
iOS
  1. 选择 iOS 应用类型。
  2. 输入 OAuth 客户端的名称。此名称会显示在您项目的 Credentials page 来标识客户端。
  3. 输入应用的软件包标识符。软件包 ID 是 CFBundleIdentifier 键添加到应用的信息属性列表资源文件 (info.plist) 中。值 最常显示在“General”窗格或“Signing &功能窗格的 Xcode 项目编辑器。软件包 ID 也会显示在 应用的“应用信息”页面 Apple 的 App Store Connect 网站
  4. (选填)

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

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

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

  5. (选填)

    输入您的团队 ID。请参阅 查找您的团队 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 scheme 的替代方案

使用 Android 版 Google 登录 SDK 此方法可将 OAuth 2.0 响应直接发送到您的应用中, 重定向 URI。

如何迁移到 Android 版 Google 登录 SDK

如果您目前在 Android 上为 OAuth 集成使用自定义架构,则需要执行以下操作: 完成以下操作,即可完全改用建议的 Google 登录功能 Android 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 是 上面的示例。请参阅 redirect_uri 参数定义,详细了解相应格式 自定义 URI 架构值的名称。
    2. 记下 scopeclient_id 请求参数, 则需要配置 Google 登录 SDK。
    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 scheme 支持。
启用自定义 URI scheme
如果推荐的替代方法对您不适用,您可以为自己的 Android 客户端:
  1. 前往您的 OAuth 2.0 凭据列表和 选择您的 Android 客户端
  2. 转到高级设置部分,查看 启用自定义 URI 架构复选框,然后点击保存以启用 自定义 URI scheme 支持。
在 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 应用商店开发者信息中心 具有与您要完成的 Chrome 扩展程序 OAuth 客户端相同的产品 ID 验证。
  • 您必须是 Chrome 应用商店内容的发布商。 了解详情 了解 Chrome 应用商店开发者信息中心内的访问权限管理。

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

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

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

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

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

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

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

当您的应用收到授权响应时,为了获得最佳可用性,它应该通过以下方式做出响应: 显示一个 HTML 网页,指示用户关闭浏览器并返回您的应用。

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

手动复制/粘贴

确定访问权限范围

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

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

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 服务器发送请求

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

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

参数
client_id 必需

应用的客户端 ID。您可以在 API Console Credentials page

redirect_uri 必需

确定 Google 的授权服务器如何向您的应用发送响应。还有 已安装的应用有多个重定向选项,并且您将为自己的 包含特定重定向方法的授权凭据

该值必须与 OAuth 2.0 中某个已获授权的重定向 URI 完全匹配 是在客户端的 API Console Credentials page。如果此值与 已获授权的 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。
  • redirect_uri_path 是可选的路径组成部分,例如 /oauth2redirect。请注意,路径应以单个 该字符与常规 HTTP 网址不同。
环回 IP 地址 http://127.0.0.1:porthttp://[::1]:port

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

请注意,移动设备支持环回 IP 地址重定向选项 应用 <ph type="x-smartling-placeholder"></ph> 已弃用

response_type 必需

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

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

scope 必需

答 空格分隔 范围列表,用于标识您的应用可以在 。这些值会告知 Google 向 用户。

范围让您的应用可以仅请求访问所需的资源 同时让用户能够控制他们向您的网页授予 应用。因此,所请求的范围数量与 以及征得用户同意的可能性

code_challenge 建议

指定将用作服务器端的编码 code_verifier 在授权代码交换期间进行质询。请参阅 创建代码 挑战部分了解详情。

code_challenge_method 建议

指定用于对将要使用的 code_verifier 进行编码的方法 在授权代码交换期间发送。此参数必须与 code_challenge 参数。code_challenge_method 的值 如果 plain 未出现在包含 code_challenge。此参数仅支持以下值: S256plain

state 建议

指定应用用来维持 授权请求和授权服务器的响应。 服务器返回您作为 name=value 对在 网址片段标识符 (#) 的 redirect_uri(在用户同意或拒绝您的应用的声明之后) 权限申请。

此参数有多种用途,例如将用户定向到 您应用中的正确资源、发送 Nonce 以及缓解跨网站请求 。由于您的 redirect_uri 可以被猜到,因此使用 state 值可以更好地确保传入的连接是 身份验证请求。如果您生成了随机字符串或对 Cookie 或 另一个用于捕获客户端状态的值,您可以验证对 此外,还要确保请求和响应来自同一个浏览器, 以防范此类攻击,例如 跨网站请求 伪造行为。请参阅 OpenID Connect 关于如何创建和确认 state 令牌的示例的文档。

login_hint 可选

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

将该参数值设为电子邮件地址或 sub 标识符,即 等同于用户的 Google ID。

授权网址示例

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

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

自定义 URI scheme

https://accounts.google.com/o/oauth2/v2/auth?
 scope=email%20profile&
 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=email%20profile&
 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 账号无法对所请求的一个或多个范围进行授权 Google Workspace 管理员。参阅 Google Workspace 管理员帮助文章 您可以控制哪些第三方和内部应用访问 Google Workspace 数据 ,详细了解管理员如何限制对所有范围或敏感 限制范围,直到明确授予对 OAuth 客户端 ID 的访问权限。

disallowed_useragent

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

Android

Android 开发者在以下位置打开授权请求时可能会遇到此错误消息: android.webkit.WebView。 开发者应该改用 Android 库,如 适用于 Android 的 Google 登录或 OpenID Foundation 的 适用于 Android 的 AppAuth

当 Android 应用在 用户从 Google 的 OAuth 2.0 授权端点转到 Google 的 OAuth 2.0 授权端点, 。开发者应该允许在 操作系统,其中包括 Android 应用链接 处理程序或默认浏览器应用。通过 Android 自定义标签页 也是一个受支持的选项。

iOS

iOS 和 macOS 开发者在以下位置打开授权请求时可能会遇到此错误: WKWebView。 开发者应该改用 iOS 库,如 iOS 版 Google 登录或 OpenID Foundation 的 适用于 iOS 的 AppAuth

当 iOS 或 macOS 应用在以下位置打开常规网页链接时,Web 开发者可能会遇到此错误 嵌入的用户代理,而用户从 Google 的 OAuth 2.0 授权端点 。开发者应该允许在 操作系统,其中包括 通用链接 处理程序或默认浏览器应用。通过 SFSafariViewController 也是一个受支持的选项。

org_internal

请求中的 OAuth 客户端 ID 属于某个项目 具体 Google Cloud Organization(Google Cloud 组织)。 有关此配置选项的详细信息,请参阅 用户类型 部分。

invalid_grant

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

刷新访问令牌时,令牌可能已过期或 已失效。 再次对用户进行身份验证,并请求用户同意以获取新令牌。如果您选择继续 请确定您的应用已正确配置, 在请求中使用正确的令牌和参数。否则,该用户账号可能具有 已被删除或停用。

redirect_uri_mismatch

授权请求中传递的 redirect_uri 与已获授权的 OAuth 客户端 ID 的重定向 URI。请在以下位置查看已获授权的重定向 URI: Google API Console Credentials page

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

redirect_uri 参数可以是指具有以下特征的 OAuth 带外 (OOB) 流程: 已弃用,不再受支持。请参阅 迁移指南,更新您的 集成。

invalid_request

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

  • 该请求的格式不正确
  • 请求缺少必需的参数
  • 请求使用的授权方法不受 Google 支持。验证您的 OAuth 集成使用推荐的集成方法
  • 重定向 URI 使用自定义架构:如果您看到错误消息 Chrome 应用不支持自定义 URI 架构自定义 URI 架构 未启用,则表示您使用的是自定义 URI 该协议在 Chrome 应用中不受支持,且在 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获取的客户 ID Credentials page
client_secret 从 API Console获取的客户端密钥 Credentials page
code 从初始请求返回的授权代码。
code_verifier 您创建的代码验证程序 第 1 步
grant_type 如 OAuth 2.0 中所定义, 规范,则必须将此字段的值设置为 authorization_code
redirect_uri 在 API Console Credentials page 指定 client_id

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

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 Web 令牌 (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/drive.metadata.readonly",
  "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
}

调用 Google API

在您的应用获得访问令牌后,您就可以使用该令牌调用 Google 代表指定的 用户账号(如果已授予 API 所需的访问权限范围)。为此,请添加 通过添加 access_token 查询来获取对 API 的请求中的访问令牌 参数或 Authorization HTTP 标头 Bearer 值。如有可能, 最好使用 HTTP 标头,因为查询字符串通常会显示在服务器日志中。大多数 可以使用客户端库来设置对 Google API 的调用(例如, 调用 Drive Files API)。

您可以访问以下网址,试用所有 Google API 并查看其作用域: OAuth 2.0 Playground

HTTP GET 示例

drive.files 端点(Drive Files API),同时使用 Authorization: Bearer HTTP 可能如下所示。请注意,您需要指定自己的访问令牌:

GET /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

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

GET https://www.googleapis.com/drive/v2/files?access_token=access_token

curl 示例

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

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files

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

curl https://www.googleapis.com/drive/v2/files?access_token=access_token

刷新访问令牌

访问令牌会定期过期,并成为相关 API 请求的无效凭据。您 可以在不提示用户授予权限的情况下刷新访问令牌(包括在用户 不存在)。

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

字段
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 以及错误代码。

延伸阅读

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