Autorizzazione e verifica

Implementa la verifica dei messaggi di richiesta per assicurarti che le richieste di pagamento e invio dell'ordine al tuo endpoint di evasione provengano da Google e per impedire a terze parti non autorizzate di chiamare il tuo endpoint.

Verifica dei messaggi tramite JWT

Per motivi di sicurezza, le richieste all'endpoint di evasione degli ordini provenienti dai server di Ordering End-to-End contengono un token web JSON (JWT) firmato nell'intestazione Authorization. Il token viene generato da un servizio di autorizzazione condiviso che può essere chiamato sia da Google sia dall'implementazione dell'endpoint di evasione.

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

Per implementare la verifica delle richieste per il tuo progetto:

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

Libreria di autorizzazione Google

Per verificare i messaggi di Ordering End-to-End e generare codici di autorizzazione per i messaggi inviati dal tuo servizio web a Google, utilizza la libreria di autenticazione Google nel linguaggio di programmazione di tua scelta:

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

Esempi di richieste di verifica

Gli esempi riportati di seguito 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");
}