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.
- Google generiert ein signiertes JWT mithilfe des Autorisierungsdienstes und der Projekt-ID Ihres Food Ordering-Projekts.
- Google sendet das signierte Token im Header
Authorization
jeder Anfrage an den Auftragsausführungsendpunkt. - 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:
- Extrahiert das JWT aus dem
Authorization
-Header eingehender Anfragen. - Decodieren Sie das Token mit der Google-Authentifizierungsbibliothek.
- Legen Sie den
audience
des Tokens auf Ihre Projekt-ID fest. - 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.
- Google-Authentifizierungsbibliothek für Node.js
- Google-Authentifizierungsbibliothek für Python
- Google-Authentifizierungsbibliothek für Java
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"); }