Usar JWT para autenticar usuarios

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

Para autenticar un usuario, una aplicación cliente debe enviar un token web JSON (JWT) en el encabezado de autorización de la solicitud HTTP a tu API de backend. API Gateway valida el token en nombre de la API, por lo que no es necesario agregar ningún código a la API para procesar la autenticación. Sin embargo, debes ajustar la configuración de la API para que la puerta de enlace sea compatible con los métodos de autenticación que elegiste.

API Gateway valida un JWT de forma rendidora con el conjunto de claves web JSON (JWKS) de la entidad emisora del JWT. La ubicación del JWKS se especifica en la configuración de la API de la puerta de enlace. API Gateway almacena en caché el JWKS durante cinco minutos y lo actualiza cada cinco minutos.

Antes de comenzar

  • Agrega el código de autenticación a tu aplicación cliente, de acuerdo con la documentación del proveedor de autenticación.

  • Cuando tu aplicación cliente envía una solicitud HTTP, el encabezado de autorización en la solicitud debe contener las siguientes reclamaciones JWT:
    • iss (Emisor)
    • sub (Asunto)
    • aud (Público)
    • iat (Hora de emisión)
    • exp (Fecha y hora de vencimiento)

Configura API Gateway para admitir la autenticación de clientes

Debes tener una sección de seguridad en la configuración de la API para que API Gateway valide las reclamaciones en el JWT firmado. El esquema que se usa para definir los métodos de seguridad depende de la versión de la especificación de OpenAPI que uses.

Para que admita la autenticación de JWT:

OpenAPI 2.0

  1. Agrega lo siguiente a tu configuración de API:
    securityDefinitions:
      your_custom_auth_id:
        authorizationUrl: ""
        flow: "implicit"
        type: "oauth2"
        # The issuer value should be unique
        x-google-issuer: "ISSUER"
        x-google-jwks_uri: "URL_PUBLIC_KEY"
        # Optional.
        x-google-audiences: "CLIENT_ID"

    Aquí:

    • ISSUER es el emisor del token.
    • URL_PUBLIC_KEY es la URL de la clave pública.
    • CLIENT_ID es el ID de cliente.
  2. Agrega una sección de seguridad en el nivel de la API para aplicar en toda la API o en el nivel de los métodos y así aplicarla a un método específico.
    security:
      - your_custom_auth_id: []

OpenAPI 3.x

  1. Agrega lo siguiente a tu configuración de API:
    components:
      securitySchemes:
        SCHEME_NAME:
          type: oauth2
          flows:
           implicit:
             authorizationUrl: ""
             scopes: {}
          x-google-auth:
            issuer: ISSUER
            jwksUri: URL_PUBLIC_KEY
            # Optional. Replace CLIENT_ID with your client ID(s) as a list of strings.
            audiences:
              - CLIENT_ID
            jwtLocations:
              - header: Authorization
                valuePrefix: "Bearer "

    Aquí:

    • ISSUER es el emisor del token.
    • URL_PUBLIC_KEY es la URL de la clave pública.
    • CLLIENT_ID es una lista de IDs de cliente como cadenas.
  2. Agrega una sección de seguridad en el nivel de la API para aplicar en toda la API o en el nivel de los métodos y así aplicarla a un método específico.
    security:
      - SCHEME_NAME: []

Puedes establecer varias definiciones de seguridad en la configuración de la API, pero cada definición debe tener una entidad emisora diferente. Si usas las secciones security a nivel de API y de los métodos, la configuración del nivel de los métodos anula la de la API.

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

Para permitir que los ID de cliente adicionales accedan al servicio de backend, puedes especificar los ID de cliente permitidos en el campo audiences correspondiente. Se especifican varios públicos como valores separados por comas en OpenAPI 2.0 y con una lista en OpenAPI 3.x. Luego, API Gateway acepta los JWT con cualquiera de los ID de cliente especificados en la reclamación aud.

El campo x-google-jwks_uri (OpenAPI 2.0) o jwksUri (OpenAPI 3.x) es obligatorio. API Gateway admite dos formatos asimétricos de clave pública definidos por esta extensión de OpenAPI:

  • Formato fijo de JWK. Por ejemplo:

    OpenAPI 2.0

    x-google-jwks_uri: "https://YOUR_ACCOUNT_NAME.YOUR_AUTH_PROVIDER_URL/.well-known/jwks.json"
    

    OpenAPI 3.x

    jwksUri: "https://YOUR_ACCOUNT_NAME.YOUR_AUTH_PROVIDER_URL/.well-known/jwks.json"
    
  • X509. Por ejemplo:

    OpenAPI 2.0

    x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com"
    

    OpenAPI 3.x

    jwksUri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com"
    

Si usas un formato de clave simétrico, configura x-google-jwks_uri (OpenAPI 2.0) o jwksUri (OpenAPI 3.x) como el URI de un archivo que contiene la cadena de clave codificada en base64url.

Realiza una llamada autenticada a una API de API Gateway

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

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

Aquí, GATEWAY_URL y TOKEN se deben reemplazar por la URL de la puerta de enlace implementada y el token de autenticación, respectivamente. Consulta Realiza una solicitud autenticada a una API de API Gateway si deseas obtener un código de muestra que envía una solicitud con el encabezado Authorization:Bearer.

Si no puedes usar el encabezado cuando envías la solicitud, puedes colocar el token de autenticación en un parámetro de búsqueda llamado access_token. Por ejemplo:

curl "GATEWAY_URL/hello?access_token=TOKEN"

Recibe resultados autenticados en tu API

Por lo general, API Gateway reenvía todos los encabezados que recibe. Sin embargo, anula el encabezado original Authorization cuando la dirección de backend se especifica mediante x-google-backend en la configuración de la API.

API Gateway enviará el resultado de la autenticación en 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.

¿Qué sigue?