Soluciona problemas de validación de JWT

Cuando una aplicación cliente incluye un token web JSON (JWT) en una solicitud a una API, el proxy de servicio extensible (ESP) valida el JWT antes de enviar la solicitud al backend de la API. En esta página, se proporciona información para la solución de problemas si falla la validación de JWT y el ESP muestra un error en la respuesta al cliente. Consulta RFC 7519 para obtener más información sobre los JWT.

Error: BAD_FORMAT

Verifica lo siguiente:

  • Asegúrate de que el JWT contenga un JSON válido.
  • Comprueba que el encabezado JWT tenga el campo "alg" y que se configure como una de las siguientes opciones: "RS256", "HS256", "RS384", "HS384", "RS512" o "HS512"
  • Comprueba el tipo de datos en los siguientes campos (si están presentes) de la carga útil del JWT:
    • Las reclamaciones "iat" (emitido en), "exp" (tiempo de vencimiento) y "nbf" (no antes) son números mayores que 0 y no son strings.
    • Los campos "sub" (sujeto), "iss" (emisor) y "jti" (ID de JWT) son strings.
    • La reclamación "aud" (público) es una string o un arreglo de strings.
  • Asegúrate de que las siguientes reclamaciones estén presentes en la carga útil del JWT: "sub" (asunto), "iss" (emisor) y "aud" (público).

El siguiente fragmento es un ejemplo de un token JWT decodificado que es válido:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "42ba1e234ac91ffca687a5b5b3d0ca2d7ce0fc0a"
    }

    Payload:
    {
      "iss": "myservice@myproject.iam.gserviceaccount.com",
      "iat": 1493833746,
      "aud": "myservice.appspot.com",
      "exp": 1493837346,
      "sub": "myservice@myproject.iam.gserviceaccount.com"
    }
    
Error: TIME_CONSTRAINT_FAILURE

Utiliza jwt.io para decodificar el JWT y asegurarte de que:

  • La reclamación "exp" (tiempo de vencimiento) existe.
  • El valor de la reclamación "exp" (tiempo de vencimiento) es una fecha y hora en el futuro. La fecha y la hora actuales deben ser anteriores a la fecha y hora de vencimiento indicadas en la reclamación "exp".
  • La reclamación "nbf" (no antes), si está presente, es una fecha y hora en el pasado. La fecha y hora actuales deben ser posteriores o iguales a la fecha y hora enumeradas en la reclamación "nbf".
Error: UNKNOWN

Utiliza jwt.io para decodificar el JWT y garantizar que:

  • Si la reclamación "iss" (emisor) es una dirección de correo electrónico, entonces las reclamaciones "sub" (asunto) y "iss" deben ser las mismas. Esto es para garantizar que el JWT se emita de forma automática a los emisores con correo electrónico.

Error: KEY_RETRIEVAL_ERROR

  • Verifica que el URI de clave pública especificado en el campo x-google-jwks_uri en documento de OpenAPI sea correcto y válido.

Error: Issuer not allowed

  • Verifica que la reclamación "iss" (emisor) en tu token JWT coincida con el campo x-google-issuer en la sección securityDefinitions del objeto de seguridad en el documento de OpenAPI.

  • En el documento de OpenAPI, verifica que el objeto de seguridad esté habilitado para el método de la API invocado.

Consulta el archivo sample openapi.yaml para ver un ejemplo de cómo describir la seguridad a nivel del método mediante el uso de los objetos securityDefinition y security.

Error: Audience not allowed

Compara la reclamación "aud" (público) en un token JWT para ver si coincide con el nombre del servicio de Endpoints, que corresponde al campo host en el documento de OpenAPI.

Si la reclamación "aud" y el nombre del servicio de Endpoints son diferentes, haz lo siguiente:

  • Verifica que la reclamación "aud" en el JWT coincida con uno de los valores x-google-audiences especificados en el documento de OpenAPI.

  • Asegúrate de que x-google-audiences y x-google-issuer estén en el mismo objeto securityDefinitions en el documento de OpenAPI.

Si la reclamación "aud" y el nombre del servicio de Endpoints son iguales, el ESP valida al público y, además, ignora los valores x-google-audiences en tu documento de OpenAPI. Por ejemplo, si el nombre del servicio es "myservice.endpoints.example-project-12345.cloud.goog", un JWT con "aud" configurado como "myservice.endpoints.example-project-12345.cloud.goog" o "https://myservice.endpoints.example-project-12345.cloud.goog" es un público válido.