Autenticar usuarios mediante tokens de ID de Google

En esta página se describe cómo admitir la autenticación de usuarios en API Gateway.

Para autenticar a un usuario, una aplicación cliente debe enviar un JSON Web Token (JWT) en el encabezado de autorización de la solicitud HTTP a tu API backend. La pasarela de APIs valida el token en nombre de tu API, por lo que no tienes que añadir ningún código a tu API para procesar la autenticación. Sin embargo, debes configurar la API de tu pasarela para que admita los métodos de autenticación que elijas.

API Gateway valida un JWT de forma eficiente mediante el conjunto de claves web de JSON (JWKS) del emisor del JWT. La ubicación de JWKS se especifica en la configuración de la API de la pasarela. API Gateway almacena en caché el JWKS durante cinco minutos y lo actualiza cada cinco minutos.

Antes de empezar

  • Añade un código de autenticación a tu aplicación cliente que permita a los usuarios autenticarse iniciando sesión con una cuenta de Google. Consulta el artículo Autenticar usuarios con cuentas de Google para obtener más información.

  • Cuando tu aplicación cliente envía una solicitud HTTP, el encabezado de autorización de la solicitud debe contener las siguientes reclamaciones de JWT:
    • iss (emisor)
    • sub (asunto)
    • aud (audiencia)
    • iat (emitido a las)
    • exp (hora de vencimiento)

Configurar API Gateway para admitir la autenticación de clientes

Debes incluir una sección de seguridad en la configuración de tu API para que API Gateway valide las reclamaciones del JWT firmado. El esquema utilizado para definir los métodos de seguridad depende de la versión de la especificación de OpenAPI que utilices.

Para admitir la autenticación mediante un token de ID de Google, sigue estos pasos:

OpenAPI 2.0

  1. Añade lo siguiente a tu configuración de API:
    securityDefinitions:
      google_id_token:
        authorizationUrl: ""
        flow: "implicit"
        type: "oauth2"
        x-google-issuer: "https://accounts.google.com"
        x-google-jwks_uri: "https://www.googleapis.com/oauth2/v3/certs"
        # Optional. Replace CLIENT_ID with your client ID
        x-google-audiences: "CLIENT_ID"
  2. Añade una sección de seguridad a nivel de API para aplicarla a toda la API o a nivel de método para aplicarla a un método específico.
    security:
       -   google_id_token: []

OpenAPI 3.x

  1. Añade lo siguiente a tu configuración de API:
    components:
      securitySchemes:
        google_id_token:
          type: oauth2
          flows:
           implicit:
             authorizationUrl: ""
             scopes: {}
          x-google-auth:
            issuer: https://accounts.google.com
            jwksUri: https://www.googleapis.com/oauth2/v3/certs
            # Optional. Replace CLIENT_ID with your client ID(s) as a list of strings.
            audiences:
              - CLIENT_ID
  2. Añade una sección de seguridad a nivel de API para aplicarla a toda la API o a nivel de método para aplicarla a un método específico.
    security:
      - google_id_token: []

Puedes definir varias definiciones de seguridad en la configuración de la API, pero cada definición debe tener un emisor diferente. Si usas secciones de seguridad tanto a nivel de API como a nivel de método, los ajustes a nivel de método anulan los ajustes a nivel de API.

El campo x-google-audiences (OpenAPI 2.0) o audiences (OpenAPI 3.x) no es obligatorio. API Gateway acepta todos los JWTs con el nombre del servicio de backend en el formato https://SERVICE_NAME en la reclamación aud.

Para permitir que otros IDs de cliente accedan al servicio backend, puedes especificar los IDs de cliente permitidos en el campo audiences correspondiente. Se especifican varias audiencias como valores separados por comas en OpenAPI 2.0 y con una lista en OpenAPI 3.x. A continuación, API Gateway acepta los JWTs con cualquiera de los IDs de cliente especificados en la reclamación aud.

Hacer una llamada autenticada a una API de API Gateway

Cuando envíes una solicitud con un token de autenticación, te recomendamos que lo incluyas en el encabezado Authorization:Bearer. Por ejemplo:

curl -H "Authorization: Bearer TOKEN" "GATEWAY_URL/hello"

Aquí, GATEWAY_URL y TOKEN deben sustituirse por la URL de la pasarela implementada y el token de autenticación, respectivamente. Consulta el artículo Enviar una solicitud autenticada a una API de API Gateway para ver un ejemplo de código que envía una solicitud mediante el encabezado Authorization:Bearer.

Si no puedes usar el encabezado al enviar la solicitud, puedes incluir el token de autenticación en un parámetro de consulta llamado access_token. Por ejemplo:

curl "GATEWAY_URL/hello?access_token=TOKEN"

Recibir resultados autenticados en tu API

API Gateway suele reenviar todos los encabezados que recibe. Sin embargo, anula el encabezado Authorization original cuando la dirección del backend se especifica mediante x-google-backend en la configuración de la API.

API Gateway enviará el resultado de la autenticación en el X-Apigateway-Api-Userinfo a la API de backend. Se recomienda usar este encabezado en lugar del encabezado Authorization original. Este encabezado está codificado en base64url y contiene la carga útil del JWT.

Siguientes pasos