Resolução de problemas de validação de JWT

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

Erro: 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"
}
Erro: 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".
Erro: 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 segundo parâmetro do objeto endpoints.Issuer está correto e é válido.

Erro: Issuer not allowed

  • Verifique se a reivindicação "iss" (emissor) no seu token JWT corresponde ao primeiro parâmetro do objeto endpoints.Issuer.

Erro: Audience not allowed

Se a reivindicação "aud" (público) num token JWT corresponder ao nome do serviço Endpoints, os frameworks do Cloud Endpoints validam o público e ignoram os valores definidos no argumento audiences no decorador @endpoints.api. Por exemplo, se o nome do seu serviço for "myservice.appspot.com", um JWT com "aud" definido como "myservice.appspot.com" ou "https://myservice.appspot.com" é um público-alvo válido.

Se a reivindicação "aud" não for igual ao nome do serviço Endpoints:

  • Verifique se a reivindicação "aud" no JWT corresponde a um dos valores no argumento audiences no decorador @endpoints.api.