解除关联操作可能会从您的平台或 Google 发起,并且两者的一致链接状态的显示可提供最佳用户体验。对于 Google 帐号关联,支持令牌撤消端点或跨帐号保护是可选的。
帐号可以通过以下任一方式解除关联:
- 用户请求
- Google 应用或 Google 帐号设置
- 您的平台
- 未能为过期的刷新令牌续期
- 您或 Google 发起的其他事件。例如,滥用和威胁检测服务导致帐号被暂停。
用户请求与 Google 解除关联
通过用户的 Google 帐号或应用发起的帐号解除关联会删除之前授予的所有访问令牌和刷新令牌,从而移除用户同意声明,并视需要调用令牌撤消端点(如果您选择实现的话)。
用户请求与您的平台解除关联
您应该为用户提供一种解除关联的机制,例如指向其帐号的网址。如果您不为用户提供解除关联的方法,请添加一个 Google 帐号链接,以便用户可以管理其关联帐号。
您可以选择实施风险共享和协作 (RISC),并通知用户帐号帐号关联状态的变化。这样,您的平台和 Google 都可以显示最新且一致的关联状态,而无需依赖刷新或访问令牌请求来更新关联状态,从而改善用户体验。
令牌过期
为了提供流畅的用户体验并避免服务中断,Google 会在其生命周期即将结束时尝试更新刷新令牌。在某些情况下,当有效的刷新令牌不可用时,可能需要用户同意才能重新关联帐号。
将平台设计为支持多个未过期的访问令牌和刷新令牌可以最大限度地减少集群环境之间的客户端-服务器交换中存在的竞态条件,避免用户中断,并最大限度地减少复杂的时间和错误处理场景。虽然最终一致,但在客户端-服务器令牌续订交换期间以及集群同步之前,旧令牌和新颁发的未过期令牌都可能会在短时间内使用。例如,在您发出新的访问令牌之后,但在接收和集群同步之前,Google 会向您的服务发出使用先前未过期的访问令牌的 Google 请求。建议使用刷新令牌轮替的替代安全措施。
其他事件
帐号可能会因各种其他原因解除关联,例如帐号处于闲置状态、暂停、恶意行为等。在这种情况下,您的平台和 Google 可以更好地管理用户帐号,并通过通知帐号和关联状态的变化来重新关联。
实现令牌撤消端点,以便 Google 进行调用,并使用 RISC 将您的令牌撤消事件通知 Google,以确保您的平台和 Google 保持一致的用户帐号关联状态。
令牌撤消端点
如果您支持OAuth 2.0令牌吊销终结点,则您的平台可以接收来自Google的通知。这使您可以通知用户链接状态更改,使令牌无效以及清理安全凭证和授权授予。
该请求具有以下形式:
POST /revoke HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&token=TOKEN&token_type_hint=refresh_token
您的令牌吊销终结点必须能够处理以下参数:
撤销端点参数 | |
---|---|
client_id | 一个字符串,用于将请求来源标识为Google。此字符串必须在您的系统中注册为Google的唯一标识符。 |
client_secret | 您在Google注册的用于服务的秘密字符串。 |
token | 要撤消的令牌。 |
token_type_hint | (可选)要撤消的令牌类型,可以是access_token 或refresh_token 。如果未指定,则默认为access_token 。 |
当令牌被删除或无效时返回响应。请参见以下示例:
HTTP/1.1 200 Success Content-Type: application/json;charset=UTF-8
如果由于某种原因无法删除令牌,请返回503响应代码,如以下示例所示:
HTTP/1.1 503 Service Unavailable Content-Type: application/json;charset=UTF-8 Retry-After: HTTP-date / delay-seconds
Google稍后或按照Retry-After
的要求重试该请求。
跨帐号保护 (RISC)
如果您支持跨帐户保护,则当访问或刷新令牌被吊销时,您的平台可以通知Google。这使Google可以通知用户链接状态更改,使令牌无效,清理安全凭证和授权授予。
跨帐户保护基于OpenID基金会开发的RISC标准。
安全事件令牌用于将令牌撤销通知Google。
解码后,令牌吊销事件类似于以下示例:
{
"iss":"http://risc.example.com",
"iat":1521068887,
"aud":"google_account_linking",
"jti":"101942095",
"toe": "1508184602",
"events": {
"https://schemas.openid.net/secevent/oauth/event-type/token-revoked":{
"subject_type": "oauth_token",
"token_type": "refresh_token",
"token_identifier_alg": "hash_SHA512_double",
"token": "double SHA-512 hash value of token"
}
}
}
您用于向Google通知令牌吊销事件的安全事件令牌必须符合下表中的要求:
令牌撤销事件 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
iss | 发行人声明:这是您托管的URL,在注册过程中已与Google共享。 | ||||||||||
aud | 受众声明:将Google识别为JWT收件人。必须将其设置为google_account_linking 。 | ||||||||||
jti | JWT ID声明:这是您为每个安全事件令牌生成的唯一ID。 | ||||||||||
iat | 声明时发出:这是一个NumericDate 值,表示创建此安全事件令牌的时间。 | ||||||||||
toe | 事件声明时间:这是一个可选的NumericDate 值,表示令牌被撤销的时间。 | ||||||||||
exp | 截止时间要求:不包括这个领域,因为造成这种通知的事件已经发生。 | ||||||||||
events |
|
有关字段类型和格式的更多信息,请参见JSON Web令牌(JWT) 。