Solução de problemas da validação do JWT

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=">

Erro: BAD_FORMAT

Verifique o seguinte:

  • Verifique se o JWT contém um JSON válido.
  • Se o cabeçalho JWT tem o campo "alg" e é definido como um dos seguintes: "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.
  • Certifique-se de que as seguintes declarações estejam presentes no payload do JWT: "sub" (assunto), "iss" (emissor) e "aud" (público-alvo).

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"
}
Erro: 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".
Erro: 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 especificado 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 campo x-google-issuer na seção securityDefinitions 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 valores x-google-audiences especificados em seu documento da OpenAPI.

  • Certifique-se de que x-google-audiences e x-google-issuer estejam no mesmo objeto securityDefinitions em seu documento da OpenAPI.

Se a declaração "aud" e o nome de serviço do Endpoints forem iguais, o ESP vai 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.