安全防護組合

本指南說明一系列功能,可傳回 Google 帳戶的其他信任訊號。帳戶管理系統可以運用這些信任信號,在註冊、建立帳戶、使用者日後回訪時,依據風險制定決策。

設定

如要接收額外聲明,應用程式必須已發布、通過驗證,並啟用安全套件功能。

如要確認應用程式已發布並通過驗證,請按照下列步驟操作:

  1. 開啟 Google Auth Platform
  2. 選取或建立應用程式專案
  3. 按一下選單中的「目標對象」
  4. 確認「發布狀態」為「正式版」
  5. 按一下選單中的「驗證中心」
  6. 確認「驗證狀態」為「已驗證」

    詳情請參閱 OAuth 應用程式驗證說明中心

如要啟用 auth_time 聲明,請按照下列步驟操作:

  1. 開啟 Google Auth Platform
  2. 選取或建立應用程式專案
  3. 按一下選單中的「設定」
  4. 在「進階設定」下方,選取「工作階段年齡聲明」,即可啟用 auth_time

支援的功能

本節說明 Security Bundle 的各項功能。

auth_time

auth_time 聲明是 OpenID Connect 通訊協定的標準部分,可提供使用者最近一次向 Google 驗證身分的時間資訊。這是 JSON 數字,代表自 Unix 紀元 (1970 年 1 月 1 日世界標準時間 00:00:00) 經過的秒數,也是使用者上次驗證的時間。這項資訊可視為時間戳記,指出使用者上次透過目前裝置或瀏覽器登入 Google 帳戶的時間。這項聲明會納入 ID 權杖,也就是包含驗證和使用者相關驗證資訊的 JSON Web Token (JWT)。

auth_time 聲明對應用程式很有價值,因為您可以藉此判斷使用者最近在使用的裝置或瀏覽器上,主動登入 Google 帳戶的時間。這對安全防護目的而言尤其重要,例如:

  • 在執行敏感的使用者動作 (例如刪除帳戶、變更帳戶聯絡方式或付款) 之前,請根據情況決定應用程式是否應發出額外的逐步驗證身分確認問題。Google 不支援 Google 帳戶重新驗證要求。

  • 以使用者 Google 帳戶工作階段的即時性和穩定性做為信任信號。一般來說,auth_time 值越新代表新鮮度越高,值越舊則代表穩定性越高。

如果是網頁應用程式,使用者登入 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」。

網頁版 GIS

網頁版「使用 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

更新建構依附元件,使用最新版本的 androidx.credentials:credentials-play-services-authcom.google.android.libraries.identity.googleid:googleid 程式庫。

使用 setClaims 建立 auth_time 類型的 Claim 物件,將其新增至登入選項:

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) 起,到使用者上次驗證身分時所經過的秒數。以下是已解碼 ID 權杖的範例,其中包含 auth_time 聲明:

{
  "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 秒。