Autorisierung und Überprüfung

Implementieren Sie eine Bestätigung der Nachrichtenanfrage, um dafür zu sorgen, dass Anfragen vom Typ „Bezahlvorgang“ und „Bestellung senden“ an Ihren Endpunkt für die Auftragsausführung von Google stammen, und verhindern, dass nicht autorisierte Dritte Ihren Endpunkt anrufen.

Nachrichtenüberprüfung mit JWT

Anfragen an den Auftragsausführungsendpunkt, die von End-to-End-Servern von Ordering stammen, enthalten aus Sicherheitsgründen ein signiertes JSON-Webtoken (JWT) im Header Authorization. Das Token wird von einem gemeinsamen Autorisierungsdienst generiert, der sowohl von Google als auch von der Implementierung des Auftragsausführungsendpunkts aufgerufen werden kann.

  1. Google generiert mithilfe des Autorisierungsdienstes und der Projekt-ID Ihres Food Ordering-Projekts ein signiertes JWT.
  2. Google sendet das signierte Token im Authorization-Header 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 Projekt-ID, Aussteller, Ablaufzeit und Ausstellungszeit. Anhand dieser Daten können Sie die Authentizität der Anfrage ermitteln.

So implementieren Sie die Anfrageüberprüfung für Ihr Projekt:

  1. Extrahieren Sie das JWT aus dem Header Authorization eingehender Anfragen.
  2. Decodieren Sie das Token mithilfe der Google-Authentifizierungsbibliothek.
  3. Legen Sie für audience des Tokens Ihre Projekt-ID fest.
  4. Prüfen Sie den Aussteller, die Projekt-ID und andere in der Tokennutzlast enthaltene Informationen auf Richtigkeit.

Google-Autorisierungsbibliothek

Verwenden Sie die Google-Authentifizierungsbibliothek in der Programmiersprache Ihrer Wahl, um Nachrichten von Ordering End-to-End zu prü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 Webdienstimplementierungscode hinzu.

Beispiele für die Anforderung einer Verifizierung

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