安全软件包

本指南介绍了一组可返回有关 Google 账号的其他信任信号的功能。这些信任信号可帮助您的账号管理系统在注册、账号创建期间以及日后针对回访用户做出基于风险的决策。

设置

如需接收其他声明,您的应用需要已发布、已验证,并且已启用安全软件包功能。

如需确认您的应用已发布并已通过验证,请执行以下操作:

  1. 打开 Google Auth Platform
  2. 为您的应用选择或创建项目
  3. 点击菜单中的受众群体
  4. 确认发布状态正式版
  5. 点击菜单中的验证中心
  6. 确认验证状态已验证

    如需了解详情,请访问 OAuth 应用验证帮助中心

如需启用 auth_time 声明,请执行以下操作:

  1. 打开 Google Auth Platform
  2. 为您的应用选择或创建项目
  3. 点击菜单中的设置
  4. 高级设置下,选择会话年龄声明以启用 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-authcom.google.android.libraries.identity.googleid:googleid 库。

实例化类型为 auth_timeClaim 对象,并使用 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 的颁发时间。通过比较 iatauth_time 声明,您可以确定自用户上次身份验证以来经过的时间(相对于特定 ID 令牌的创建时间)。例如,如果 iat 为 1748881189,而 auth_time 为 1748875426,则差值为 5763 秒,表示经过了 1 小时 36 分 3 秒的时间。