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=">
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" }
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"
.
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 tu 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 campox-google-issuer
en la secciónsecurityDefinitions
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 valoresx-google-audiences
especificados en el documento de OpenAPI.Asegúrate de que
x-google-audiences
yx-google-issuer
estén en el mismo objetosecurityDefinitions
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.