承認と確認

リクエスト メッセージの検証を実装して、フルフィルメント エンドポイントへの購入手続きと注文送信のリクエストが Google からのものであることを確認します。また、未承認の第三者がエンドポイントを呼び出すことを防ぎます。

JWT を使用したメッセージの検証

注文エンドツーエンド サーバーからフルフィルメント エンドポイントへのリクエストには、セキュリティのため、Authorization ヘッダーに署名付き JSON Web Token(JWT)が含まれています。トークンは、Google とフルフィルメント エンドポイントの実装の両方から呼び出せる共有認可サービスによって生成されます。

  1. Google は、承認サービスとフード オーダー プロジェクトのプロジェクト ID を使用して、署名付き JWT を生成します。
  2. Google は、すべてのリクエストの Authorization ヘッダーで署名付きトークンをフルフィルメント エンドポイントに送信します。
  3. エンドポイントは、Google Auth ライブラリを使用して署名付きトークンをデコードする必要があります。デコードされたトークンには、プロジェクト ID、発行者、有効期限、発行日時などの詳細情報が含まれます。このデータを使用して、リクエストの真正性を確認します。

プロジェクトにリクエストの確認を実装する手順は次のとおりです。

  1. 受信リクエストの Authorization ヘッダーから JWT を抽出します。
  2. Google 認証ライブラリを使用してトークンをデコードします。
  3. トークンの audience をプロジェクト ID に設定します。
  4. トークンのペイロードに含まれる発行元、プロジェクト ID などの情報が正しいことを確認します。

Google Authorization Library

エンドツーエンドの注文からメッセージを検証し、ウェブサービスが Google に送信するメッセージの認証コードを生成するには、ご希望のプログラミング言語で Google Auth ライブラリを使用します。

次のいずれかのライブラリをダウンロードして、ウェブサービス実装コードに追加します。

リクエスト確認の例

次の例は、リクエストの検証を実装する方法を示しています。

Node.js

const auth = require('google-auth-library')
const authClient = new auth.OAuth2Client()

/**
 * Verifies that an incoming request came from Google.
 * @param {String} idToken - The ID token used to verify the request
 * (i.e. The value found in the Authorization header of an incoming request).
 * @param {String} audience - The expected audience of the request
 * (i.e. The project ID for your project).
 * @return {boolean} True if request came from Google, false otherwise.
 */
function isRequestFromGoogle(idToken, audience) {
  authClient.verifyIdToken({idToken, audience}, (err, info) => {
    return !(err || info['iss'] !== 'https://accounts.google.com')
  })
}
    

Python

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

def isRequestFromGoogle(audience, token):
    """ Verifies that an incoming request came from Google.

    Args:
        audience (str): The expected audience of the request
                        (i.e. The project ID for your project)
        token (str): The ID token used to verify the request
                     (i.e. The value found in the Authorization
                     header of an incoming request)
    Returns:
        True if the request came from Google, False otherwise.
    """
    id_info = id_token.verify_oauth2_token(token, requests.Request(), audience)
    return id_info['iss'] == 'https://accounts.google.com'
    

Java

/**
 * Verifies that an incoming request came from Google.
 * @param audience The expected audience of the request
 *                 (i.e. The project ID for your project)
 * @param token The ID token used to verify the request
 *              (i.e. The value found in the Authorization
 *              header of an incoming request)
 * @return {@code true} if request is from Google, else {@code false}
 */
public boolean isRequestFromGoogle(String audience, String token) {
  GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier
      .Builder(transport, jsonFactory)
      .setAudience(Collections.singletonList(audience))
      .build();

  GoogleIdToken idToken = verifier.verify(token);
  if (idToken == null) return false;
  Payload payload = idToken.getPayload();
  String issuer = (String) payload.get("iss");
  return issuer.equals("https://accounts.google.com");
}