サーバー側で Google ID トークンを確認する

Google が ID トークンを返すと、HTTP POST メソッド リクエストによって、パラメータ名 credential とともにログイン エンドポイントに送信されます。

次の例は、ID トークンを検証して使用する一般的な手順を示しています。この例は Python 言語で記述されています。

  1. クロスサイト リクエスト フォージェリ(CSRF)トークンを検証します。ログイン エンドポイントに認証情報を送信する際、Google はダブル送信 Cookie パターンを使用して CSRF 攻撃を防ぎます。送信のたびにトークンが生成されます。次に、次のコード例に示すように、トークンが Cookie と POST 本文の両方に配置されます。

    csrf_token_cookie = self.request.cookies.get('g_csrf_token')
    if not csrf_token_cookie:
        webapp2
    .abort(400, 'No CSRF token in Cookie.')
    csrf_token_body
    = self.request.get('g_csrf_token')
    if not csrf_token_body:
        webapp2
    .abort(400, 'No CSRF token in post body.')
    if csrf_token_cookie != csrf_token_body:
        webapp2
    .abort(400, 'Failed to verify double submit cookie.')
  2. ID トークンを検証します。

    トークンが有効であることを確認するには、次のことを確認します。 条件が満たされます。

    • ID トークンが Google によって適切に署名されている。Google の公開鍵を使用する ( JWK または PEM 形式) トークンの署名を検証します。これらの鍵は定期的にローテーションされます。調べる レスポンスの Cache-Control ヘッダーを使用して、 再度取得する必要があります
    • ID トークンの aud の値がアプリのいずれかの値と等しい クライアント ID などがあります。このチェックは、悪意のあるクライアントに ID トークンを発行するのを防ぐために必要です。 アプリが、アプリのバックエンド サーバー上の同一ユーザーに関するデータにアクセスするために使用されています。
    • ID トークンの iss の値は次と等しい accounts.google.com または https://accounts.google.com
    • ID トークンの有効期限(exp)を過ぎていない。
    • ID トークンが Google Workspace または Cloud 組織アカウントの場合は、hd クレームを確認できます。これは、ホストされている Pod が ユーザーのドメインです。これは、リソースへのアクセスをそのメンバーのみに制限する場合に できます。このクレームがない場合、アカウントは Google がホストするドメイン。

    emailemail_verifiedhd フィールドを使用して、 Google はメールアドレスをホストし、その権威があります。Google が信頼できる場合、 そのユーザーが正当なアカウント所有者であることがわかっているため、パスワードやその他の 確認しましょう。

    Google が信頼できるケース:

    • email には @gmail.com という接尾辞が付いています。これは Gmail アカウントです。
    • email_verified は true で、hd が設定されています。これは G Suite アカウントです。

    ユーザーは Gmail や G Suite を使用せずに Google アカウントを登録できます。日時 email@gmail.com という接尾辞がなく、hd が存在しないと、Google にはありません。 認証には、信頼できる認証方法、パスワード、その他の本人確認方法を使用することが推奨されます。 できます。email_verified も、Google が最初に検証した ユーザーに付与できますが、サードパーティの所有権が付与されます。 アカウントが変更された可能性があります。

    これらの検証ステップを実行するために独自のコードを記述するのではなく、 プラットフォームに適した Google API クライアント ライブラリを使用するか、 JWT ライブラリ。開発とデバッグの場合は、tokeninfo を呼び出すことができます。 検証エンドポイントを指定します。

    Google API クライアント ライブラリの使用

    Google API クライアント ライブラリのいずれか( JavaNode.jsPHPPython など) は、本番環境で Google ID トークンを検証する場合におすすめの方法です。

    <ph type="x-smartling-placeholder">
    JavaNode.jsPHPPython
    </ph>

    Java で ID トークンを検証するには、 GoogleIdTokenVerifier オブジェクトです。例:

    import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
    import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
    import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;

    ...

    GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
       
    // Specify the CLIENT_ID of the app that accesses the backend:
       
    .setAudience(Collections.singletonList(CLIENT_ID))
       
    // Or, if multiple clients access the backend:
       
    //.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
       
    .build();

    // (Receive idTokenString by HTTPS POST)

    GoogleIdToken idToken = verifier.verify(idTokenString);
    if (idToken != null) {
     
    Payload payload = idToken.getPayload();

     
    // Print user identifier
     
    String userId = payload.getSubject();
     
    System.out.println("User ID: " + userId);

     
    // Get profile information from payload
     
    String email = payload.getEmail();
     
    boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
     
    String name = (String) payload.get("name");
     
    String pictureUrl = (String) payload.get("picture");
     
    String locale = (String) payload.get("locale");
     
    String familyName = (String) payload.get("family_name");
     
    String givenName = (String) payload.get("given_name");

     
    // Use or store profile information
     
    // ...

    } else {
     
    System.out.println("Invalid ID token.");
    }

    GoogleIdTokenVerifier.verify() メソッドで JWT を検証する 署名、aud クレーム、iss クレーム、 exp の申し立て。

    ID トークンが Google Workspace または Cloud 組織アカウントの場合は、ドメイン名を確認することで hd クレームを確認できます。 Payload.getHostedDomain() メソッドが返す値。ドメインの アカウントがドメインによって管理されていることを確認するには email 申請では不十分です できます。

    </ph>

    Node.js で ID トークンを検証するには、Node.js 用 Google 認証ライブラリを使用します。 ライブラリをインストールします。

    npm install google-auth-library --save
    次に、verifyIdToken() 関数を呼び出します。例:

    const {OAuth2Client} = require('google-auth-library');
    const client = new OAuth2Client();
    async
    function verify() {
     
    const ticket = await client.verifyIdToken({
          idToken
    : token,
          audience
    : CLIENT_ID,  // Specify the CLIENT_ID of the app that accesses the backend
         
    // Or, if multiple clients access the backend:
         
    //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]
     
    });
     
    const payload = ticket.getPayload();
     
    const userid = payload['sub'];
     
    // If the request specified a Google Workspace domain:
     
    // const domain = payload['hd'];
    }
    verify
    ().catch(console.error);

    verifyIdToken 関数は、以下を確認します。 JWT 署名、aud クレーム、exp クレーム、 iss クレーム。

    ID トークンが Google Workspace または Cloud 組織アカウントの場合は、hd クレームを確認できます。これは、ホストされている Pod が ユーザーのドメインです。これは、リソースへのアクセスをメンバーのみに制限する場合に使用します 特定のドメインのこの申し立てがない場合は、アカウントが Google がホストするドメインです。

    </ph>

    PHP で ID トークンを検証するには、PHP 用の Google API クライアント ライブラリを使用します。 ライブラリをインストールします(Composer を使用するなど)。

    composer require google/apiclient
    次に、verifyIdToken() 関数を呼び出します。例:

    require_once 'vendor/autoload.php';

    // Get $id_token via HTTPS POST.

    $client
    = new Google_Client(['client_id' => $CLIENT_ID]);  // Specify the CLIENT_ID of the app that accesses the backend
    $payload
    = $client->verifyIdToken($id_token);
    if ($payload) {
      $userid
    = $payload['sub'];
     
    // If the request specified a Google Workspace domain
     
    //$domain = $payload['hd'];
    } else {
     
    // Invalid ID token
    }

    verifyIdToken 関数は、以下を確認します。 JWT 署名、aud クレーム、exp クレーム、 iss クレーム。

    ID トークンが Google Workspace または Cloud 組織アカウントの場合は、hd クレームを確認できます。これは、ホストされている Pod が ユーザーのドメインです。これは、リソースへのアクセスをメンバーのみに制限する場合に使用します 特定のドメインのこの申し立てがない場合は、アカウントが Google がホストするドメインです。

    </ph>

    Python で ID トークンを検証するには、 verify_oauth2_token 使用します。例:

    from google.oauth2 import id_token
    from google.auth.transport import requests

    # (Receive token by HTTPS POST)
    # ...

    try:
       
    # Specify the CLIENT_ID of the app that accesses the backend:
        idinfo
    = id_token.verify_oauth2_token(token, requests.Request(), CLIENT_ID)

       
    # Or, if multiple clients access the backend server:
       
    # idinfo = id_token.verify_oauth2_token(token, requests.Request())
       
    # if idinfo['aud'] not in [CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]:
       
    #     raise ValueError('Could not verify audience.')

       
    # If the request specified a Google Workspace domain
       
    # if idinfo['hd'] != DOMAIN_NAME:
       
    #     raise ValueError('Wrong domain name.')

       
    # ID token is valid. Get the user's Google Account ID from the decoded token.
        userid
    = idinfo['sub']
    except ValueError:
       
    # Invalid token
       
    pass

    verify_oauth2_token 関数で JWT を検証する aud クレーム、exp クレームの 3 つが存在します。 hd も確認する必要があります (該当する場合は)そのオブジェクトを調べ、 verify_oauth2_token が返品可能。複数のクライアントが aud クレームも手動で検証します。

  3. トークンの有効性が確認できたら、Google ID トークンの情報を使用して、サイトのアカウント ステータスを関連付けることができます。

    • 未登録のユーザー: 必要に応じて、ユーザーが追加のプロファイル情報を提供できる登録ユーザー インターフェース(UI)を表示できます。また、ユーザーは新しいアカウントとログイン中のユーザー セッションをサイレントで作成することもできます。

    • サイトにすでに存在する既存のアカウント: エンドユーザーがパスワードを入力して、以前のアカウントを Google 認証情報にリンクできるウェブページを表示できます。これにより、ユーザーが既存のアカウントにアクセスできることを確認できます。

    • 再びログインする連携ユーザー: ユーザーをサイレント ログインできます。