Autorisierung und Überprüfung

Implementieren Sie die Überprüfung von Anfragenachrichten, um sicherzustellen, dass Checkout- und Bestellanfragen an Ihren Endpunkt für die Auftragsausführung von Google stammen, und verhindern Sie, dass unbefugte Dritte Ihren Endpunkt aufrufen.

Nachrichtenüberprüfung mit JWT

Anfragen an deinen Fulfillment-Endpunkt, die von End-to-End-Servern für Bestellungen stammen, enthalten aus Sicherheitsgründen ein signiertes JSON Web Token (JWT) im Authorization-Header. Das Token wird von einem gemeinsamen Autorisierungsdienst generiert, der sowohl von Google als auch von deiner Implementierung des Auslieferungsendpunkts aufgerufen werden kann.

  1. Google generiert ein signiertes JWT mit dem Autorisierungsdienst und der Projekt-ID Ihres Food Ordering-Projekts.
  2. Google sendet das signierte Token im Authorization-Header jeder Anfrage an Ihren Fulfillment-Endpunkt.
  3. Ihr Endpunkt muss das signierte Token mit der Google Auth Library decodieren. Das decodierte Token enthält Details wie die Projekt-ID, den Aussteller, das Ablaufdatum und das Ausstellungsdatum. Anhand dieser Daten können Sie die Echtheit der Anfrage bestimmen.

So fordern Sie die Bestätigung für Ihr Projekt an:

  1. Extrahieren Sie das JWT aus dem Authorization-Header eingehender Anfragen.
  2. Dekodieren Sie das Token mit der Google Auth-Bibliothek.
  3. Legen Sie die audience des Tokens auf Ihre Projekt-ID fest.
  4. Prüfe, ob Aussteller, Projekt-ID und andere Informationen in der Tokennutzlast korrekt sind.

Google Authorization Library

Wenn Sie Nachrichten von Ordering End-to-End prüfen und Autorisierungscodes für Nachrichten generieren möchten, die Ihr Webservice an Google sendet, verwenden Sie die Google Auth Library in der Programmiersprache Ihrer Wahl:

Laden Sie eine dieser Bibliotheken herunter und fügen Sie sie dem Code Ihrer Webdienstimplementierung hinzu.

Beispiele für die Bestätigungsanfrage

Die folgenden Beispiele zeigen, wie die Anfragebestätigung implementiert wird:

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