Autorizzazione e verifica

Implementa la verifica dei messaggi di richiesta per assicurarti che le richieste di pagamento e di invio degli ordini al tuo endpoint di evasione degli ordini provengano da Google e che terze parti non autorizzate non chiamino il tuo endpoint.

Verifica dei messaggi mediante JWT

Per motivi di sicurezza, le richieste al tuo endpoint di evasione degli ordini provenienti dai server end-to-end di ordinazione contengono un token JWT (JSON Web Token) firmato nell'intestazione Authorization. Il token viene generato da un servizio di autorizzazione condivisa che può essere chiamato sia da Google sia dall'implementazione dell'endpoint di evasione degli ordini.

  1. Google genera un JWT firmato utilizzando il servizio di autorizzazione e l'ID del progetto Food Ordering.
  2. Google invia il token firmato nell'intestazione Authorization di ogni richiesta al tuo endpoint di evasione degli ordini.
  3. L'endpoint deve decodificare il token firmato utilizzando la libreria di autenticazione Google. Il token decodificato contiene dettagli come l'ID progetto, l'emittente, la scadenza e l'ora di emissione. Utilizza questi dati per determinare l'autenticità della richiesta.

Per implementare la verifica della richiesta per il tuo progetto:

  1. Estrai il JWT dall'intestazione Authorization delle richieste in entrata.
  2. Decodifica il token utilizzando la libreria di autenticazione di Google.
  3. Imposta il valore audience del token sul tuo ID progetto.
  4. Verifica l'accuratezza dell'autorità di certificazione, dell'ID progetto e di altre informazioni contenute nel payload del token.

Libreria autorizzazioni Google

Per verificare i messaggi inviati dall'ordine end-to-end e generare codici di autorizzazione per i messaggi che il tuo servizio web invia a Google, utilizza la libreria di autenticazione di Google nel linguaggio di programmazione che preferisci:

Scarica e aggiungi una di queste librerie al codice di implementazione del tuo servizio web.

Esempi di richiesta di verifica

I seguenti esempi mostrano come implementare la verifica delle richieste:

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