Autorización y verificación

Implementa la verificación de mensajes de solicitud para garantizar que las solicitudes de confirmación de la compra y envío de pedido a tu extremo de entrega provengan de Google y así evitar que terceros no autorizados llamen a tu extremo.

Verificación de mensajes con JWT

Las solicitudes a tu extremo de entrega que provienen de los servidores de extremo a extremo del pedido contienen un token web JSON (JWT) firmado en el encabezado Authorization por motivos de seguridad. El token se genera mediante un servicio de autorización compartida al que pueden llamar tanto Google como la implementación del extremo de entrega.

  1. Google genera un JWT firmado con el servicio de autorización y el ID del proyecto de tu proyecto de pedidos de comida.
  2. Google envía el token firmado en el encabezado Authorization de cada solicitud al extremo de entrega.
  3. Tu extremo debe decodificar el token firmado mediante la biblioteca de Google Auth. El token decodificado contiene detalles como el ID del proyecto, la entidad emisora, la hora de vencimiento y la hora de emisión. Usa estos datos para determinar la autenticidad de la solicitud.

Para implementar la verificación de solicitudes en tu proyecto, sigue estos pasos:

  1. Extrae el JWT del encabezado Authorization de las solicitudes entrantes.
  2. Decodifica el token con la biblioteca de Google Auth.
  3. Configura el audience del token en el ID del proyecto.
  4. Verifica la entidad emisora, el ID del proyecto y otra información incluida en la carga útil del token para comprobar su precisión.

Biblioteca de autorización de Google

Para verificar los mensajes del pedido de extremo a extremo y generar códigos de autorización para los mensajes que tu servicio web envía a Google, usa la biblioteca de Google Auth en el lenguaje de programación que desees:

Descarga y agrega una de estas bibliotecas al código de implementación de tu servicio web.

Ejemplos de solicitudes de verificación

En los siguientes ejemplos, se muestra cómo implementar la verificación de solicitudes:

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