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: 401: Jwt issuer is not configured

Esto puede ocurrir cuando, durante la implementación del ESPv2 en Cloud Run, la marca --allow-unauthenticated no se usa en el comando gcloud run deploy. Si no se usa la marca, el token JWT se intercepta y verifica mediante el servidor de IAM de <a=" docs="" managing-access"="" run="" securing="">control de acceso de Cloud Run, y no mediante el ESPv2. IAM puede un emisor diferente del ESPv2. </a=">

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 jwksUri en la anotación ApiIssuer sea correcto y válido.

Error: Issuer not allowed

  • Verifica que la reclamación "iss" (emisor) en tu token JWT coincida con el valor issuer en la anotación ApiIssuer.

Error: Audience not allowed

Si la reclamación "aud" (público) en un token JWT coincide con el nombre del servicio de Endpoints, Cloud Endpoints Frameworks valida al público a la vez que ignora los valores configurados en el elemento audiences en la anotación ApiIssuerAudience. Por ejemplo, si el nombre del servicio es "myservice.appspot.com", un JWT con "aud" configurado como "myservice.appspot.com" o "https://myservice.appspot.com" es un público válido.

Si la reclamación "aud" no es la misma que el nombre del servicio de Endpoints, haz lo siguiente:

  • Verifica que la reclamación "aud" en el JWT coincida con uno de los valores del elemento audiences en la anotación ApiIssuerAudience.