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.
- Google generiert ein signiertes JWT mit dem Autorisierungsdienst und der Projekt-ID Ihres Food Ordering-Projekts.
- Google sendet das signierte Token im
Authorization
-Header jeder Anfrage an Ihren Fulfillment-Endpunkt. - 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:
- Extrahieren Sie das JWT aus dem
Authorization
-Header eingehender Anfragen. - Dekodieren Sie das Token mit der Google Auth-Bibliothek.
- Legen Sie die
audience
des Tokens auf Ihre Projekt-ID fest. - 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:
- Google Auth-Bibliothek für Node.js
- Google Auth-Bibliothek für Python
- Google Auth-Bibliothek für Java
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"); }