Autorisierung und Überprüfung

Implementieren Sie die Bestätigung von Anfragenachrichten, damit die Anfragen „Bezahlen“ und „Senden“ an den Auftragsausführungsendpunkt von Google stammen, und verhindern Sie, dass unbefugte Dritte Ihren Endpunkt aufrufen.

Nachrichtenüberprüfung mit JWT

Anfragen an den Auftragsausführungsendpunkt, die von Order with Google-Servern stammen, enthalten aus Sicherheitsgründen ein signiertes JSON Web Token (JWT) im Authorization-Header. Das Token wird von einem freigegebenen Autorisierungsdienst generiert, der sowohl von Google als auch von Ihrem Endpunkt für die Auftragsausführung aufgerufen werden kann.

  1. Google generiert ein signiertes JWT mithilfe des Autorisierungsdienstes und der Projekt-ID Ihres Food Ordering-Projekts.
  2. Google sendet das signierte Token im Header Authorization jeder Anfrage an den Auftragsausführungsendpunkt.
  3. Ihr Endpunkt muss das signierte Token mithilfe der Google-Authentifizierungsbibliothek decodieren. Das decodierte Token enthält Details wie die Projekt-ID, den Aussteller, die Ablaufzeit und die Ausstellungszeit. Verwenden Sie diese Daten, um die Authentizität der Anfrage zu bestimmen.

So implementieren Sie die Anfragebestätigung für Ihr Projekt:

  1. Extrahiert das JWT aus dem Authorization-Header eingehender Anfragen.
  2. Decodieren Sie das Token mit der Google-Authentifizierungsbibliothek.
  3. Legen Sie den audience des Tokens auf Ihre Projekt-ID fest.
  4. Prüfen Sie die Genauigkeit des Ausstellers, die Projekt-ID und andere Informationen in der Nutzlast des Tokens.

Google Authorization Library

Verwenden Sie die Google-Authentifizierungsbibliothek in der Programmiersprache Ihrer Wahl, um Nachrichten von Order with Google zu überprüfen und Autorisierungscodes für Nachrichten zu generieren, die Ihr Webdienst an Google sendet.

Laden Sie eine dieser Bibliotheken herunter und fügen Sie sie Ihrem Webdienst-Implementierungscode hinzu.

Beispiele für die Bestätigung

Die folgenden Beispiele zeigen, wie die Überprüfung von Anfragen 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");
}