安全防護組合

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

工作階段

應用程式的驗證要求會傳回 ID 權杖。舉例來說,當使用者按下「使用 Google 帳戶登入」按鈕時,系統會將 ID 權杖傳回顯示該按鈕的 Android、iOS 或網頁用戶端/伺服器應用程式。

登入 Google 帳戶的驗證程序是獨立事件,與其他事件分開。ID 權杖中傳回的聲明代表這項事件。例如,登入 Google 帳戶時的驗證時間和方法。

驗證時機有兩個,使用者工作階段也有兩個:

  • 使用者 <-> Google 工作階段:使用者登入 Google 帳戶時建立。Google 會管理這個工作階段的生命週期和安全性。auth_timeamr 聲明會提供這個工作階段的相關洞察資料。
  • 使用者 <-> 您的應用程式工作階段:使用者登入應用程式後建立,通常是透過「使用 Google 帳戶登入」啟動。您的應用程式會使用聲明管理這個工作階段,以改善工作階段和帳戶管理決策。

使用者通常會透過多部裝置與 Google 服務互動,例如手機、桌上型電腦、智慧螢幕或電視。在每個平台或裝置上登入都會建立不同的工作階段。如果是透過網路登入,系統會在特定瀏覽器和 Google 之間建立工作階段;請注意,私密瀏覽和無痕模式會建立各自獨立的工作階段。因此,單一 Google 帳戶可能會在不同瀏覽器和裝置上同時啟用多個工作階段。如需更多詳細資料,請參閱「查看可存取帳戶的裝置」。

Google 帳戶狀態

Google 帳戶生命週期的典型事件如下:

本指南所述的 Security Bundle 功能適用於啟用或停用的帳戶,但不適用於 Google 帳戶建立或刪除事件。

Google 可能隨時停用帳戶,如需部分原因,請參閱「您的帳戶已停用」。發生這種情況時,系統會終止所有有效的 Google 工作階段,並由 Google 的跨帳戶防護服務傳送 RISC 事件。停用的帳戶無法使用「使用 Google 帳戶登入」,也就是說,系統不會核發 ID 權杖,因此無法用來監控停用的使用者帳戶。

接收跨帳戶防護 (RISC) 事件是選用功能,但這些事件是管理使用者與應用程式之間工作階段的重要信號。如要瞭解如何實作 RISC 和回應事件,請參閱「透過跨帳戶防護功能保護使用者帳戶」一文。

設定

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

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

接著,啟用其他著作權聲明:

  1. 按一下選單中的「設定」
  2. 在「進階設定」下方,選取下列項目:
    • 工作階段時長權杖附加資訊,啟用 auth_time
    • 驗證強度權杖附加資訊,啟用 amr

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

支援的功能

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

驗證方法參考資料

驗證方法參考資料 (amr) 是 OpenID Connect claims,用於說明使用者與 Google 間上次驗證事件所用的方法。

在 Google 支援的可能 IANA.AMR 值中,下列值表示:

  • hwk 使用硬體安全金鑰
  • mfa 已完成多重驗證
  • pwd 使用密碼
  • swk 使用軟體金鑰,例如密碼金鑰
  • sms 使用簡訊驗證
  • tel 使用電話驗證

這些值會以字串的 JSON 陣列形式,在 ID 權杖的 amr 聲明中傳回。

只有在使用驗證方法時有可用資訊,ID 權杖才會包含 amr 聲明,即使要求也可能不會出現。

Google 帳戶擁有者可以選擇是否要求使用兩步驟驗證,以及要使用哪種 MFA 方法。 在 Google 帳戶上啟用進階保護後,系統會要求使用強效的兩步驟驗證方法,例如 Titan 安全金鑰 (hwk) 或密碼金鑰 (swk)。在這兩種情況下,登入 Google 帳戶時使用多個驗證因素,就會出現 mfa 值。

mfa 表示驗證事件符合 Google 的多重驗證規定。舉例來說,如果 Google 帳戶驗證使用密碼 (pwd) 和密碼金鑰 (swk),就會產生這項聲明 "amr": ["mfa", "pwd", "swk"]

如要進一步瞭解帳戶安全和使用者驗證,請參閱下列資源: 加入進階保護計畫,享有 Google 最強大的帳戶安全防護功能使用密碼金鑰登入帳戶,以及 使用安全金鑰進行兩步驟驗證

Workspace 管理員會控管受管理 Workspace 帳戶的驗證政策,並可能要求使用多重驗證或安全金鑰。詳情請參閱「Google 身分管理總覽」、「Google Cloud 的多重驗證規定」和「登入防護與控管措施」。

驗證時間

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_timeamr 聲明的具體方法因所用 API 而異,但每個 API 都包含選用的 claims 參數,可要求 auth_timeamr

OIDC 通訊協定

直接使用 OAuth 平台時,請將 auth_time 新增至選用的 claims 要求參數,藉此要求 auth_time。將聲明 JSON 物件的 id_token 欄位值設為 {"auth_time":{"essential":true}}。同樣地,將 {"amr":{"essential":true}} 新增至 claims 即可要求 amr

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 },
            "amr": {"essential":true}
          }
        }

詳情請參閱「OpenID Connect」。

網頁版 GIS

適用於網頁的「使用 Google 帳戶登入」程式庫有兩個 API:HTML 和 JavaScript,可要求額外聲明。舉例來說,使用 JavaScript API 要求 auth_timeamr

<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, amr",
      });
      google.accounts.id.renderButton(
        document.getElementById("buttonDiv"),
        { type: "standard", size: "large" }
      );
    }
  </script>
  <div id="buttonDiv"></div>
</body>
</html>

詳情請參閱「使用 Google 帳戶登入網頁」。

Android 版 GIS

setClaims 方法和 Claim 物件用於要求 auth_timeamr

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

使用 setClaims 例項化 auth_timeamr 類型的 Claim 物件,將這些物件新增至登入選項清單:

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
    .setAutoSelectEnabled(true)
    .setFilterByAuthorizedAccounts(true)
    .setServerClientId(WEB_CLIENT_ID)
    .setNonce("NONCE")
    .setClaims(ImmutableList.of(
           new Claim("auth_time", true),
           new Claim("amr", true)
    ))
    .build()

詳情請參閱「使用 Google 帳戶登入功能驗證使用者」。

iOS

iOS 版 使用 Google 帳戶登入 SDK 會將 authTimeClaim 物件和 claims 參數新增至 GIDSignIn 類別,用於選擇性要求 auth_timeamr

應用程式會使用 ASWebAuthenticationSession 更新裝置範圍內的共用 Cookie Jar。在 iOS 12 以上版本和 macOS 10.15 以上版本中,GIDSignIn 預設會使用這個方法。在這個情境中,登入 Google 帳戶的使用者會經過驗證,工作階段也會儲存在共用 Cookie 罐中。這是使用者在裝置上最後一次進行 Google 驗證的時間,auth_time不只是在您的應用程式中。

SFSafariViewControllerWKWebViewUIWebView 會在應用程式內的獨立沙箱中運作,因此使用 auth_time 時請避免使用這些屬性。auth_time 是使用者上次登入應用程式的時間,由於這個值一律是最近的時間,因此意義不大。

如要要求 auth_time,請將 GoogleSignIn 依附元件更新至最新版本,並建立 authTimeClaim 物件,然後新增至 claims 集合。

如要要求 amr,請建立 amrClaim 物件並新增至 claims 集。

Swift

將聲明集新增至 GIDSignIn.sharedInstance.signIn 方法:

let authTimeClaim = GIDClaim.authTime()
let amrClaim = GIDClaim.amr()
let claims = Set([authTimeClaim, amrClaim])

// Start the sign-in process GIDSignIn.sharedInstance.signIn( withPresenting: rootViewController, claims: claims ) { signInResult, error in guard let result = signInResult else { print("Error signing in: (error?.localizedDescription ?? "No error description")") return } // If sign in succeeded, display the app's main content View print("ID Token: (result.user.idToken?.tokenString ?? "No token")") }

Objective-C

將聲明集新增至 signInWithPresentingViewController 方法:

GIDClaim *authTimeClaim = [GIDClaim authTimeClaim];
GIDClaim *AMRClaim = [GIDClaim AMRClaim];
NSSet *claims = [NSSet setWithArray:@[authTimeClaim, AMRClaim]];

// Include the claims set and start the sign-in process [GIDSignIn.sharedInstance signInWithPresentingViewController:self hint:nil claims:claims completion:^(GIDSignInResult * _Nullable signInResult, NSError * _Nullable error) { // On success signInResult.user.idToken // contains the requested claims. }];

詳情請參閱「將 Google 登入整合至 iOS 或 macOS 應用程式」。

回應

如果要求中包含 auth_timeamr 聲明,這些聲明會與其他標準聲明 (例如 iss (簽發者)、sub (主體)、aud (目標對象) 和 exp (到期時間)) 一併在 ID 權杖酬載回應中傳回。

缺少聲明可能是因為應用程式未通過驗證,或是停用了其他設定 (這是預設設定)。請按照「設定」中的操作說明,確認使用的用戶端 ID 和應用程式已通過驗證,並啟用其他聲明。

auth_time 聲明的值是 JSON 數字,代表自 Unix 紀元 (1970 年 1 月 1 日世界標準時間 00:00:00) 起,到使用者上次驗證身分時經過的秒數。

amr 聲明的值是字串的 JSON 陣列,代表上次 Google 帳戶登入事件期間使用的驗證方法。

以下是已解碼的 ID 權杖範例,其中包含 auth_timeamr 聲明:

{
  "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,
  "amr": ["mfa", "pwd", "tel"],
  "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 秒。