本指南介绍了一组可返回有关 Google 账号的其他信任信号的功能。这些信任信号可帮助您的账号管理系统在注册、账号创建期间以及日后针对回访用户做出基于风险的决策。
设置
如需接收其他声明,您的应用需要已发布、已验证,并且已启用安全软件包功能。
如需确认您的应用已发布并已通过验证,请执行以下操作:
- 打开 Google Auth Platform
- 为您的应用选择或创建项目
- 点击菜单中的受众群体
- 确认发布状态为正式版
- 点击菜单中的验证中心
确认验证状态为已验证。
如需了解详情,请访问 OAuth 应用验证帮助中心。
如需启用 auth_time 声明,请执行以下操作:
- 打开 Google Auth Platform
- 为您的应用选择或创建项目
- 点击菜单中的设置
- 在高级设置下,选择会话年龄声明以启用
auth_time。
支持的功能
本部分介绍了构成安全套装的各项功能。
auth_time
auth_time 声明是 OpenID Connect 协议的标准组成部分,用于提供有关最终用户最近一次向 Google 进行身份验证的时间的信息。这是一个 JSON 数字,表示自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来经过的秒数,也是用户上次通过身份验证的时间。您可以将其视为一个时间戳,用于指示用户上次通过当前设备或浏览器登录其 Google 账号的时间。
此声明包含在 ID 令牌中,而 ID 令牌是一个 JSON Web 令牌 (JWT),其中包含有关身份验证和用户的已验证信息。
auth_time 声明对您的应用很有价值,因为它可以让您确定用户最近一次在所用设备或浏览器上主动登录 Google 账号的时间。这对于安全目的(例如以下情况)可能尤为重要:
在执行敏感的用户操作(例如删除账号、更改账号联系方式或付款)之前,就应用是否应发出额外的身份验证升级质询做出明智的决定。Google 不支持 Google 账号重新验证请求。
将用户 Google 账号会话的新鲜度和稳定性用作信任信号。一般来说,较新的
auth_time值表示新鲜度,而较旧的值表示稳定性。
对于 Web 应用,用户登录 Google 账号后,其浏览器和操作系统会构成一个会话。此外,您的网站也会单独维护一个用户会话。auth_time 值越新,表示用户最近登录过自己的 Google 账号。
这通常表明用户积极参与互动,可以解读为风险较低的信号。
在 Android 等移动平台上,用户通常使用指纹或面部扫描等生物识别方法以及设备专用 PIN 码或解锁图案直接登录设备。移动应用和平台通常使用这些基于平台的身份验证方法,而不是通过 Google 创建新会话,因此 Google 账号登录和 auth_time 的相应更新并不频繁。因此,如果最近的 auth_time 值发生变化,可能表明长时间运行的 Google 账号会话发生了变化,从而导致风险增加。
信任信号是一个复杂的主题。auth_time 预计会与其他信号一起使用,例如是否启用了多重身份验证 (MFA)、使用的身份验证方法以及应用与平台之间的用户会话时长。
auth_time 请求
用于请求 auth_time 声明的具体方法因所用 API 而异,但每个 API 都包含一个可选的 claims 参数来请求 auth_time。
OIDC 协议
直接使用 OAuth 平台时,通过将 auth_time 添加到可选声明请求参数来请求 auth_time。将声明 JSON 对象的 id_token 字段的值设置为 {"auth_time":{"essential":true}}。例如:
https://accounts.google.com/o/oauth2/v2/auth? response_type=id_token& client_id=YOUR_CLIENT_ID& scope=openid email profile& redirect_uri=https://example.com/user-login& nonce=123-456-7890& claims={"id_token":{"auth_time":{"essential":true}}}
如需了解详情,请参阅 OpenID Connect。
适用于 Web 的 GIS
适用于 Web 的“通过 Google 账号登录”库具有两个 API:HTML 和 JavaScript,用于请求其他声明。例如,使用 JavaScript API 请求 auth_time:
<html>
<body>
<script src="https://accounts.google.com/gsi/client" async></script>
<script>
window.onload = function () {
google.accounts.id.initialize({
client_id: "YOUR_WEB_CLIENT_ID",
callback: function(rsp) { console.log(rsp.credential); },
essential_claims: "auth_time",
});
google.accounts.id.renderButton(
document.getElementById("buttonDiv"),
{ type: "standard", size: "large" }
);
}
</script>
<div id="buttonDiv"></div>
</body>
</html>如需了解详情,请参阅使用 Google 账号登录(网页版)。
Android 版 GIS
setClaims 方法和 Claim 对象用于请求 auth_time。
更新 build 依赖项,以使用最新版本的 androidx.credentials:credentials-play-services-auth 和 com.google.android.libraries.identity.googleid:googleid 库。
实例化类型为 auth_time 的 Claim 对象,并使用 setClaims 将其添加到登录选项中:
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder() .setAutoSelectEnabled(true) .setFilterByAuthorizedAccounts(true) .setServerClientId(WEB_CLIENT_ID) .setNonce("NONCE") .setClaims(ImmutableList.of(new Claim("auth_time", true))) .build()
如需了解详情,请参阅使用“通过 Google 账号登录”功能对用户进行身份验证。
auth_time 响应
当请求中包含 auth_time 声明时,该声明会与其他标准声明(例如 iss [颁发者]、sub [主题]、aud [受众群体] 和 exp [到期时间])一起显示在 ID 令牌载荷响应中。auth_time 声明的值是一个 JSON 数字,表示自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来,直到用户上次进行身份验证时所经过的秒数。以下是包含 auth_time 声明的已解码 ID 令牌的示例:
{ "iss": "https://accounts.google.com", "azp": "YOUR_CLIENT_ID", "aud": "YOUR_CLIENT_ID", "sub": "117726431651943698600", "email": "alice@example.com", "email_verified": true, "nonce": "123-456-7890", "auth_time": 1748875426, "nbf": 1748880889, "name": "Elisa Beckett", "picture": "https://lh3.googleusercontent.com/a/default-user=s96-c", "given_name": "Elisa", "family_name": "Beckett", "iat": 1748881189, "exp": 1748884789, "jti": "8b5d7ce345787d5dbf14ce6e08a8f88ee8c9b5b1" }
ID 令牌还包含 iat(颁发时间)声明,用于指明 JWT 的颁发时间。通过比较 iat 和 auth_time 声明,您可以确定自用户上次身份验证以来经过的时间(相对于特定 ID 令牌的创建时间)。例如,如果 iat 为 1748881189,而 auth_time 为 1748875426,则差值为 5763 秒,表示经过了 1 小时 36 分 3 秒的时间。