Quando um aplicativo cliente inclui um Token da Web JSON (JWT, na sigla em inglês) em uma solicitação para uma API, o Extensible Service Proxy (ESP) valida o JWT antes de enviar a solicitação ao back-end da API. Nesta página, você verá informações sobre solução de problemas se a validação do JWT falhar e o ESP retornar um erro na resposta ao cliente. Consulte RFC 7519 para saber mais sobre JWTs.
Erro:401: Jwt issuer is not configured
Isso pode acontecer se, ao implantar o ESPv2 no Cloud Run, a sinalização
--allow-unauthenticated
não for usada no comando gcloud run deploy
.
Se a sinalização não for usada, o token JWT será interceptado
e verificado pelo servidor IAM de <a=" docs="" managing-access"="" run="" securing="">controle
de acesso do Cloud Run e não do ESPv2. O IAM pode usar um emissor diferente de
ESPv2.
</a=">
BAD_FORMAT
Verifique o seguinte:
- Verifique se o JWT contém um JSON válido.
- Verifique se o cabeçalho JWT tem o campo
"alg"
e está definido como uma das seguintes opções:"RS256"
,"HS256"
,"RS384"
,"HS384"
,"RS512"
ou"HS512"
- Verifique o tipo de dados dos seguintes campos, se eles estiverem presentes, no payload do JWT:
- Se as declarações
"iat"
(emitido às),"exp"
(prazo de validade) e"nbf"
(não antes) são números maiores que 0 e não strings. - Se os campos
"sub"
(assunto),"iss"
(emissor) e"jti"
(ID do JWT) são strings. - Se a declaração
"aud"
(público-alvo) é uma string ou uma matriz de strings. - Verifique se as seguintes declarações estão presentes no payload do JWT:
"sub"
(assunto),"iss"
(emissor) e"aud"
(público).
A seguir, você encontra um exemplo de token decodificado do JWT 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
Use jwt.io (em inglês) para decodificar o JWT e verifique o seguinte:
- A declaração
"exp"
(prazo de validade) existe. - O valor da declaração
"exp"
(prazo de validade) é uma data e hora no futuro. A data e a hora atuais devem ser anteriores ao prazo de validade e ao horário listados na declaração"exp"
. - A declaração
"nbf"
(não antes de), se presente, é uma data e um horário no passado. A data e hora atuais devem ser posteriores ou iguais à data e hora listadas na declaração"nbf"
.
UNKNOWN
Use jwt.io (em inglês) para decodificar o JWT e verifique o seguinte:
- Se a declaração
"iss"
(emissor) for um endereço de e-mail, as declarações"sub"
(assunto) e"iss"
devem ser as mesmas. Isso garante que o JWT seja autoemitido para emissores por e-mail.
Erro: KEY_RETRIEVAL_ERROR
- Verifique se o URI da chave pública especificada no campo
x-google-jwks_uri
no documento da OpenAPI está correto e é válido.
Erro: Issuer not allowed
Verifique se a declaração
"iss"
(emissor) no token JWT corresponde ao campox-google-issuer
na seçãosecurityDefinitions
do objeto de segurança no documento da OpenAPI.No documento da OpenAPI, verifique se o objeto de segurança está ativado para o método de API invocado.
Consulte o arquivo openapi.yaml de amostra para saber como descrever a segurança no nível do método com os objetos securityDefinition
e security
.
Erro: Audience not allowed
Compare a declaração "aud"
(público-alvo) em um token do JWT para ver se ela corresponde ao nome do serviço do Endpoints, que corresponde ao campo host
no documento da OpenAPI.
Se a declaração "aud"
e o nome do serviço do Endpoints forem diferentes:
Verifique se a declaração
"aud"
no JWT corresponde a um dos valoresx-google-audiences
especificados em seu documento da OpenAPI.Certifique-se de que
x-google-audiences
ex-google-issuer
estejam no mesmo objetosecurityDefinitions
em seu documento da OpenAPI.
Se as declarações "aud"
e o nome de serviço do Endpoints forem iguais, o ESP validará o público-alvo e ignorará os valores de x-google-audiences
no documento da OpenAPI. Por exemplo, se o nome do serviço for "myservice.endpoints.example-project-12345.cloud.goog"
, um JWT com "aud"
definido como "myservice.endpoints.example-project-12345.cloud.goog"
ou "https://myservice.endpoints.example-project-12345.cloud.goog"
será um público-alvo válido.