如需支持 OAuth 2.0 隐式 流程,您的服务需要通过 HTTPS 提供授权端点。此端点负责进行身份验证并征得用户同意以获取数据访问权限。授权端点会向尚未登录的用户显示登录界面,并记录用户对所请求访问权限的同意情况。
当 Google 应用需要调用您服务的某个已获授权的 API 时,Google 会使用此端点征得用户同意,以便代表用户调用这些 API。
Google 帐号关联:OAuth 隐式流程
以下序列图详细介绍了用户、Google 和您服务的端点之间的互动。
角色和职责
下表定义了 Google 帐号关联 (GAL) OAuth 隐式流程中参与者的角色和职责。请注意,在 GAL 中,Google 充当 OAuth 客户端,而您的服务充当 身份/服务提供商。
| 参与者 / 组件 | GAL 角色 | 职责 |
|---|---|---|
| Google 应用 / 服务器 | OAuth 客户端 | 发起流程,使用浏览器重定向接收访问令牌, 并安全地存储该令牌以访问您服务的 API。 |
| 您的授权端点 | 授权服务器 | 对用户进行身份验证,征得用户同意,并直接向 Google 发放长期有效的 访问令牌。 |
| Google 重定向 URI | 回调端点 | 从您的授权服务接收用户重定向,并在网址
片段中包含
access_token 和 state 值。 |
Google 发起的典型 OAuth 2.0 隐式流程会按以下流程进行:
- Google 在用户的浏览器中打开您的授权端点。用户登录(如果尚未登录),并授予 Google 权限以使用您的 API 访问其数据(如果尚未授予权限)。
- 您的服务会创建访问令牌并将其返回给 Google。 为此,请将用户的浏览器重定向回 Google,并在请求中附上访问令牌。
- Google 会调用您服务的 API,并在每个请求中附上访问令牌。您的服务会验证访问令牌是否授予 Google 访问 API 的授权,然后完成 API 调用。
实现方案
请按照以下步骤实现隐式流程。
第 1 步:处理授权请求
当 Google 发起帐号关联时,它会将用户重定向到您的授权端点。如需了解详细的协议合同和参数要求,请参阅授权端点。
如需处理该请求,请执行以下操作:
验证请求:
- 确认
client_id与分配给 Google 的客户端 ID 一致。 - 确认
redirect_uri与预期的 Google 重定向 网址:none https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID - 验证
response_type是否为token。
- 确认
对用户进行身份验证:
- 检查用户是否已登录您的服务。
- 如果用户未登录,请提示用户完成登录或注册流程。
生成访问令牌:
- 创建与用户和客户端关联的唯一且难以猜测的访问令牌。
重定向回 Google:
- 将浏览器重定向到
redirect_uri中提供的网址。 - 在 网址片段 (哈希)中附加以下参数:
access_token:您生成的访问令牌。token_type:必须为bearer。state:从 Google 收到的未修改的状态值。
- 将浏览器重定向到
处理 userinfo 请求
userinfo 端点是受 OAuth 2.0 保护的资源,会返回关联用户的声明。实现和托管 userinfo 端点是可选的,但以下用例除外:
从您的令牌端点成功检索到访问令牌后,Google 会向您的 userinfo 端点发送请求,以检索关联用户的基本个人资料信息。
| userinfo 端点请求标头 | |
|---|---|
Authorization header |
Bearer 类型的访问令牌。 |
例如,如果您的 userinfo 端点可通过
https://myservice.example.com/userinfo 时,请求可能如下所示:
GET /userinfo HTTP/1.1 Host: myservice.example.com Authorization: Bearer ACCESS_TOKEN
为了让 userinfo 端点能够处理请求,请执行以下步骤:
- 从 Authorization 标头中提取访问令牌,并返回与访问令牌相关联的用户的信息。
- 如果访问令牌无效,则使用
WWW-Authenticate响应标头返回 HTTP 401 Unauthorized 错误。下面是一个 userinfo 错误响应示例: 如果在关联过程中返回 401 未经授权错误或任何其他失败的错误响应,该错误将无法恢复,检索到的令牌将被舍弃,并且用户必须重新开始关联流程。HTTP/1.1 401 Unauthorized WWW-Authenticate: error="invalid_token", error_description="The Access Token expired"
如果访问令牌有效,则返回 HTTPS 正文中包含以下 JSON 对象的 HTTP 200 响应 回答:
如果您的 userinfo 端点返回 HTTP 200 成功响应,则系统会针对用户的 Google 账号注册检索到的令牌和声明。{ "sub": "USER_UUID", "email": "EMAIL_ADDRESS", "given_name": "FIRST_NAME", "family_name": "LAST_NAME", "name": "FULL_NAME", "picture": "PROFILE_PICTURE", }userinfo 端点响应 sub系统中用于识别用户的唯一 ID。 email用户的电子邮件地址。 given_name可选:用户的名字。 family_name可选:用户的姓氏。 name可选:用户的全名。 picture可选:用户的个人资料照片。