Quando uma aplicação cliente inclui um token da Web JSON (JWT) num pedido a uma API, o proxy de serviço extensível (ESP) valida o JWT antes de enviar o pedido ao back-end da API. Esta página fornece informações de resolução de problemas se a validação JWT falhar e o ESP devolver um erro na resposta ao cliente. Consulte a RFC 7519 para mais informações acerca dos JWTs.
Erro:401: Jwt issuer is not configured
Isto pode acontecer quando implementa o ESPv2 no Cloud Run e a flag
--allow-unauthenticated
não é usada no comando gcloud run deploy
.
Se a flag não for usada, o token JWT é intercetado e validado pelo servidor IAM de controlo de acesso do Cloud Run e não pelo ESPv2. O IAM pode usar um emissor diferente do ESPv2.
</a=">
BAD_FORMAT
Verifique o seguinte:
- Certifique-se de que o JWT contém JSON válido.
- Verifique se o cabeçalho JWT tem o campo
"alg"
e está definido como um dos seguintes:"RS256"
,"HS256"
,"RS384"
,"HS384"
,"RS512"
ou"HS512"
- Verifique o tipo de dados dos seguintes campos (se estiverem presentes) no payload do JWT:
- As reivindicações
"iat"
(emitido a),"exp"
(hora de validade) e"nbf"
(não antes de) são números superiores a 0 e não strings. - Os campos
"sub"
(assunto),"iss"
(emissor) e"jti"
(ID do JWT) são strings. - A reivindicação
"aud"
(público-alvo) é uma string ou uma matriz de strings. - Certifique-se de que as seguintes reivindicações estão presentes no payload JWT:
"sub"
(subject),"iss"
(issuer) e"aud"
(audience).
Segue-se um exemplo de um token JWT descodificado que é 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 para descodificar o JWT e certifique-se de que:
- A reivindicação
"exp"
(hora de validade) existe. - O valor da reivindicação
"exp"
(hora de validade) é uma data e uma hora no futuro. A data e hora atuais têm de ser anteriores à data e hora de validade indicadas na reivindicação"exp"
. - A reivindicação
"nbf"
(não antes) (se presente) é uma data e uma hora no passado. A data e a hora atuais têm de ser posteriores ou iguais à data e hora indicadas na reivindicação"nbf"
.
UNKNOWN
Use jwt.io para descodificar o JWT e garantir que:
- Se a reivindicação
"iss"
(emissor) for um endereço de email, as reivindicações"sub"
(assunto) e"iss"
devem ser iguais. Isto garante que, para os emissores de email, o JWT é autoemitido.
Erro: KEY_RETRIEVAL_ERROR
- Verifique se o URI da chave pública especificado no campo
x-google-jwks_uri
no seu documento OpenAPI está correto e é válido.
Erro: Issuer not allowed
Verifique se a reivindicação
"iss"
(emissor) no seu token JWT corresponde ao campox-google-issuer
na secçãosecurityDefinitions
do objeto de segurança no seu documento OpenAPI.No seu documento OpenAPI, verifique se o objeto de segurança está ativado para o método API invocado.
Consulte o ficheiro
sample openapi.yaml
para ver um exemplo de como descrever a segurança ao nível do método através dos objetos
securityDefinition
e security
.
Erro: Audience not allowed
Compare a reivindicação "aud"
(público-alvo) num token JWT para ver se corresponde ao nome do serviço Endpoints, que corresponde ao campo host
no documento OpenAPI.
Se a reivindicação "aud"
e o nome do serviço Endpoints forem diferentes:
Verifique se a reivindicação
"aud"
no JWT corresponde a um dos valoresx-google-audiences
especificados no seu documento OpenAPI.Certifique-se de que o
x-google-audiences
e ox-google-issuer
estão no mesmo objetosecurityDefinitions
no seu documento OpenAPI.
Se a reivindicação "aud"
e o nome do serviço Endpoints forem iguais, o ESP valida o público-alvo e ignora os valores x-google-audiences
no seu documento OpenAPI. Por exemplo, se o nome do seu 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"
é um público-alvo válido.