Zaimplementuj weryfikację wiadomości z prośbą o zgodę, aby mieć pewność, że żądania usługi Checkout i przesyłania zamówień do Twojego punktu końcowego realizacji pochodzą od Google i uniemożliwiają nieautoryzowanym osobom trzecim wywołanie punktu końcowego.
Weryfikowanie wiadomości przy użyciu tokena JWT
Żądania wysyłane do punktów końcowych realizacji, które pochodzą z serwerów Order with Google, zawierają w podpisie token sieciowy JSON (JWT) z nagłówka Authorization
. Token jest generowany przez wspólną usługę autoryzacji, która może zostać wywołana zarówno przez Google, jak i Twoją implementację punktu końcowego realizacji.
- Google generuje podpisany token JWT z użyciem usługi autoryzacji i identyfikatora projektu projektu zamawiania jedzenia.
- Google wyśle podpisany token w nagłówku
Authorization
każdego żądania do punktu końcowego realizacji. - Twój punkt końcowy musi zdekodować podpisany token przy użyciu biblioteki uwierzytelniania Google. Zdekodowany token zawiera takie informacje jak identyfikator projektu, wydawca, czas ważności i czas wysłania. Użyj tych danych, aby określić autentyczność żądania.
Aby wdrożyć weryfikację prośby w projekcie, wykonaj te czynności:
- Wyodrębnij token JWT z nagłówka
Authorization
żądań przychodzących. - Zdekoduj token za pomocą biblioteki uwierzytelniania Google.
- Ustaw
audience
tokena na identyfikator projektu. - Sprawdź, czy wydawca, identyfikator projektu i inne informacje zawarte w ładunku tokena są poprawne.
Biblioteka autoryzacji Google
Aby zweryfikować wiadomości od firmy Order with Google i wygenerować kody autoryzacji dla wiadomości wysyłanych do Twojej usługi internetowej, użyj biblioteki uwierzytelniania Google w wybranym języku programowania:
- Biblioteka uwierzytelniania Google w Node.js
- Biblioteka uwierzytelniania Google w Pythonie
- Biblioteka uwierzytelniania Google w Javie
Pobierz jedną z tych bibliotek i dodaj ją do kodu implementacji usługi internetowej.
Przykłady próśb o weryfikację
Poniższe przykłady pokazują, jak wdrożyć żądanie weryfikacji:
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"); }