認証と確認

リクエスト メッセージによる確認を実装して、フルフィルメント エンドポイントに対する Checkout リクエストと Order 送信リクエストが Google から送信され、未承認の第三者がエンドポイントを呼び出すのを防ぎます。

JWT を使用したメッセージ確認

セキュリティ強化のため、Order with Google サーバーから送信されたフルフィルメント エンドポイントへのリクエストには、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 認証ライブラリ

Order with Google からのメッセージを検証し、ウェブサービスから Google に送信されるメッセージの認証コードを生成するには、任意のプログラミング言語で Google 認証ライブラリを使用します。

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

確認リクエストの例

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

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");
}