セキュリティ バンドル

このガイドでは、Google アカウントに関する追加の信頼シグナルを返す一連の機能について説明します。これらの信頼シグナルは、ユーザーの登録時、アカウント作成時、それ以降のログイン時に、アカウント管理システムがリスクベースの判断を行うのに役立ちます。

セッション

アプリケーションによる認証リクエストは、ID トークンを返します。たとえば、[Google でログイン] ボタンが押されると、ボタンを表示している Android、iOS、ウェブのクライアント アプリケーションまたはサーバー アプリケーションに ID トークンが返されます。

Google アカウントへのログイン認証は、個別のイベントです。 ID トークンで返されるクレームは、このイベントを表します。たとえば、Google アカウントへのログインに使用された認証時間と認証方法などです。

認証のタイミングとユーザー セッションは次の 2 つです。

  • ユーザー <-> Google セッション ユーザーが Google アカウントにログインしたときに確立されます。Google は、このセッションのライフサイクルとセキュリティを管理します。auth_time クレームと amr クレームを使用すると、このセッションに関する分析情報を取得できます。
  • ユーザー <-> アプリケーション セッション ユーザーがアプリケーションにログインした後に確立されます。多くの場合、[Google でログイン] を使用して開始されます。アプリケーションは、クレームを使用してこのセッションを管理し、セッションとアカウントの管理に関する判断を改善します。

ユーザーは、スマートフォン、パソコン、スマート ディスプレイ、テレビなど、複数のデバイスで Google サービスを利用することがよくあります。各プラットフォームまたはデバイスにログインすると、個別のセッションが確立されます。ウェブにログインする場合、特定のブラウザと Google の間にセッションが確立されます。プライベート ブラウジング モードとシークレット モードでは、独自の個別のセッションが作成されます。そのため、1 つの Google アカウントで、さまざまなブラウザやデバイスで複数の個別のセッションを同時にアクティブにできます。詳細については、 アカウントにアクセスしたデバイスを確認するをご覧ください。

Google アカウントのステータス

Google アカウントのライフサイクルの一般的なイベントは次のとおりです。

このガイドで説明するセキュリティ バンドルの機能は、有効なアカウントまたは無効なアカウントに適用されますが、Google アカウントの作成イベントや削除イベントには適用されません。

Google は、アカウントが無効になる理由に記載されている理由により、いつでもアカウントを無効にすることがあります。この場合、アクティブな Google セッションはすべて終了し、Google のクロスアカウント保護機能から RISC イベントが送信されます。無効なアカウントでは [Google でログイン] を使用できません。つまり、ID トークンが発行されないため、無効なユーザー アカウントのモニタリングに使用できません。

クロスアカウント保護(RISC)イベントの受信は任意ですが、これらのイベントは、ユーザーとアプリ間のセッションを管理するための重要なシグナルとして機能します。RISC を実装して イベントに対応する方法については、クロスアカウント保護機能でユーザー アカウントを保護するをご覧ください。

設定

追加のクレームを受信するには、アプリを公開して確認し、 セキュリティ バンドルの機能を有効にする必要があります。まず、アプリが公開されて確認されていることを確認します。

  1. Google Auth Platform を開く
  2. アプリのプロジェクトを選択または作成する
  3. [オーディエンス] をクリックし、[公開ステータス] が [本番環境] であることを確認する
  4. [確認センター] をクリックし、[確認ステータス] が [確認済み] であることを確認する

次に、追加のクレームを有効にします。

  1. メニューの [設定] をクリックする
  2. [詳細設定] で、以下を選択します。
    • [セッション経過時間に関する申し立て] を選択して auth_time を有効にする
    • [認証強度のクレーム] を選択して amr を有効にする

詳細については、OAuth アプリの確認に関するヘルプセンターをご覧ください。

サポートされている機能

このセクションでは、セキュリティ バンドルを構成する個々の機能について説明します。

認証方法のリファレンス

認証方法のリファレンス(amr)は、ユーザーと Google の間の最後の認証イベントで使用された方法を記述する OpenID Connect クレームです。

Google は、IANA.AMR の値のうち、次の 値がサポートされています。

これらの値の 1 つ以上が、ID トークンの amr クレーム内の文字列の JSON 配列として返されます。

amr クレームは、使用された認証方法に関する情報が利用可能な場合にのみ ID トークンに含まれます。リクエストされた場合でも含まれないことがあります。

Google アカウントの所有者は、2 段階認証プロセスを必須にするかどうか、使用する MFA 方法を選択できます。 Google アカウントで高度な保護機能が有効になっている場合は、Titan セキュリティ キーhwk)やパスキーswk)などの強力な 2 段階認証プロセスが必要です。どちらの場合も、Google アカウントへのログイン時に複数の要素が使用されると、mfa 値が存在します。

mfa が存在する場合、認証イベントが多要素認証に関する Google の要件を満たしていることを確認できます。たとえば、パスワード(pwd)とパスキー(swk)を使用して Google アカウントを認証すると、このクレームは"amr": ["mfa", "pwd", "swk"]になります。

アカウントのセキュリティとユーザー認証について詳しくは、高度な保護機能プログラムで Google 最強のアカウント セキュリティを実現するパスワードの代わりにパスキーでログインする、および2 段階認証プロセスにセキュリティ キーを使用するをご覧ください。

Workspace 管理者は、管理対象の Workspace アカウントの認証ポリシーを制御し、MFA またはセキュリティ キーの使用を義務付けることができます。詳しくは、 Google ID 管理の概要Google Cloud ログインの保護と制御の多要素認証の要件をご覧ください。

認証時間

auth_time クレームは、OpenID Connect プロトコル の標準的な部分であり、エンドユーザーが Google で最後に認証した日時に関する情報 を提供します。これは、Unix エポック(1970 年 1 月 1 日 00:00:00 UTC)からの経過秒数を表す JSON 数値で、ユーザーが最後に認証した時刻です。現在のデバイスまたはブラウザから Google アカウントへのユーザーの最後のログイン イベントを示すタイムスタンプと考えてください。 このクレームは、認証とユーザーに関する確認済みの情報を含む JSON ウェブトークン(JWT)である ID トークンに含まれています。

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 クレームと amr クレームのリクエストに使用される具体的な方法は、使用する API によって異なりますが、どの API にも auth_timeamr をリクエストするためのオプションの claims パラメータが含まれています。

OIDC プロトコル

OAuth プラットフォームを直接使用する場合は、オプションの claims リクエスト パラメータに追加して auth_time をリクエストします。クレーム JSON オブジェクトの id_token フィールドの値を {"auth_time":{"essential":true}} に設定します。 同様に、claims{"amr":{"essential":true}} を追加して 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 でログイン ライブラリには、追加のクレームをリクエストするための HTML API と JavaScript API の 2 つがあります。たとえば、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-auth ライブラリと com.google.android.libraries.identity.googleid:googleid ライブラリの最新バージョンを使用します。

タイプ auth_timeamrClaim オブジェクトをインスタンス化し、 setClaims を使用してログイン オプションのリストに追加します。

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 ジャーを更新します。GIDSignIn は、iOS 12 以降と macOS 10.15 以降でデフォルトでこのメソッドを使用します。このシナリオでは、Google アカウントにログインするユーザーが認証され、セッションが共有 Cookie ジャーに保存されます。 ここで、auth_time はアプリ内だけでなく、デバイスでのユーザーの最後の Google 認証です。

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. }];

詳細については、iOS または macOS アプリへの Google ログインの統合をご覧ください。

回答

auth_time クレームまたは amr クレームがリクエストに含まれている場合、ID トークン ペイロード レスポンスで、iss(発行者)、sub(件名)、aud(オーディエンス)、exp(有効期限)などの他の標準クレームとともに返されます。

クレームが見つからない場合は、アプリが確認されていないか、追加の設定が無効になっている可能性があります。これはデフォルトです。設定の手順に沿って、使用中のクライアント ID とアプリが確認済みで、追加のクレームが有効になっていることを確認してください。

auth_time クレームの値は、Unix エポック(1970 年 1 月 1 日 00:00:00 UTC)からユーザー認証が最後に発生した時刻までの経過秒数を表す JSON 数値です。

amr クレームの値は、最後の Google アカウント ログイン イベントで使用された認証方法を表す文字列の JSON 配列です。

これは、auth_time クレームと amr クレームを含むデコードされた 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,
  "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 トークンには、JWT が発行された時刻を示す iat(発行時刻)クレームも含まれています。iat クレームと auth_time クレームを比較することで、特定の ID トークンが作成された時点からのユーザーの最後の認証からの経過時間を判断できます。たとえば、iat が 1748881189 で auth_time が 1748875426 の場合、差は 5763 秒で、1 時間 36 分 3 秒の経過時間を表します。