Autoryzacja i weryfikacja

Wprowadź weryfikację wiadomości z żądaniem, aby mieć pewność, że żądania dotyczące płatności i przesyłania zamówienia do Twojego punktu końcowego do realizacji pochodzą od Google, i uniemożliwić nieautoryzowanym stronom trzecim wywoływanie Twojego punktu końcowego.

Weryfikacja wiadomości za pomocą JWT

Żądania wysyłane do punktu końcowego realizacji, które pochodzą z serwerów obsługujących proces zamawiania, zawierają podpisany token sieciowy JSON (JWT) w nagłówku Authorization. Token jest generowany przez współdzieloną usługę autoryzacji, którą można wywołać zarówno z Google, jak i z implementacji punktu końcowego realizacji.

  1. Google generuje podpisany token JWT za pomocą usługi autoryzacji i identyfikatora projektu Twojego projektu Zamawianie jedzenia.
  2. Google wysyła podpisany token w nagłówku Authorization każdego żądania do punktu końcowego realizacji.
  3. Punkt końcowy musi zdekodować podpisany token za pomocą biblioteki Google Auth. Odkodowany token zawiera takie informacje jak identyfikator projektu, wystawca, czas wygaśnięcia i czas wydania. Użyj tych danych, aby określić autentyczność żądania.

Aby wdrożyć weryfikację prośby w przypadku projektu:

  1. Wyodrębnij token JWT z nagłówka Authorization przychodzących żądań.
  2. Odkoduj token za pomocą biblioteki Google Auth Library.
  3. Ustaw audience tokenu na identyfikator projektu.
  4. Sprawdź, czy wystawca, identyfikator projektu i inne informacje zawarte w ładunku tokena są poprawne.

Biblioteka Google Authorization Library

Aby weryfikować wiadomości z usługi zamawiania end-to-end i generować kody autoryzacji dla wiadomości wysyłanych przez Twoją usługę internetową do Google, użyj biblioteki Google Auth na wybranym przez siebie języku programowania:

Pobierz jedną z tych bibliotek i dodaj ją do kodu implementacji usługi internetowej.

Przykłady prośby o weryfikację

Te przykłady pokazują, jak zaimplementować weryfikację żądania:

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