Solução de problemas de erro de ambiente de execução de decodificação de JWT

Esta é a documentação da Apigee e da Apigee híbrida.
Confira a documentação da Apigee Edge.

FailedToDecode

Código do erro

steps.jwt.FailedToDecode

Corpo da resposta de erro

{
  "fault": {
    "faultstring": "Failed to Decode Token: policy({0})",
    "detail": {
       "errorcode": "steps.jwt.FailedToDecode"
     }
  }
}

Causa

Esse erro ocorrerá se o JSON Web Token (JWT) especificado no elemento <Source> da política de decodificação de JWT estiver malformado, inválido ou não puder ser decodificado.

Um JWT estruturado corretamente precisa conter um cabeçalho, um payload e uma assinatura no seguinte formato: header.payload.signature. Se o JWT passado para a política DecodeJWT não tiver uma parte do componente, você receberá o erro. Por exemplo, se o JWT tiver apenas payload.signature, mas não tiver header, o erro ocorrerá.

Diagnóstico

  1. Identifique a variável especificada no elemento <Source> da política de decodificação do JWT. Essa variável precisa conter o JWT.

    Veja um exemplo de política de decodificação de JWT:

    <DecodeJWT name="JWT-Decode-HS256">
        <DisplayName>JWT Verify HS256</DisplayName>
        <Source>request.header.authorization</Source>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    </DecodeJWT>
    

    No exemplo acima, o JWT deve estar contido no cabeçalho de solicitação da autorização.

  2. Analise a variável identificada na etapa 1 e verifique se o JWT é válido. Se o JWT de entrada não for válido, essa é a causa do erro.

    No exemplo de solicitação de API abaixo, o JWT de entrada é transmitido no cabeçalho da solicitação de autorização:

    curl -v "http://$EXTERNAL_IP/v1/decodeJWT" -H "Authorization: Bearer eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"
    

    Em que $EXTERNAL_IP é o IP do balanceador de carga externo. Esse endereço IP é exposto à Internet. Veja mais informações em Configurar o roteamento.

    O exame de fechamento do JWT mostra que o formato payload.signature é inválido. O formato esperado do JWT é header.payload.signature. Como resultado, a política de decodificação de JWT falha com o erro :

    "faultstring": "Failed to Decode Token: policy({0})"
    

Resolução

Verifique se o JWT transmitido para a política de decodificação de JWT contém os três elementos, está formatado corretamente e se pode ser decodificado.

Para corrigir o exemplo mostrado acima, transmita um JWT válido com o formato header.payload.signature. Para isso, faça a chamada de API usando o comando cURL da seguinte forma:

curl -v "http://$EXTERNAL_IP/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"

Em que $EXTERNAL_IP é o IP do balanceador de carga externo. Esse endereço IP é exposto à Internet. Veja mais informações em Configurar o roteamento.

InvalidToken

Código do erro

steps.jwt.InvalidToken

Corpo da resposta de erro

{
  "fault": {
    "faultstring": "Invalid token: policy({0})",
    "detail": {
      "errorcode": "steps.jwt.InvalidToken"
     }
  }
}

Causa

Esse erro ocorrerá se a variável de fluxo especificada no elemento <Source> da política de decodificação de JWT for:

  • fora do escopo (não disponível no fluxo específico em que a política está sendo executada) ou
  • não é possível resolver (não está definida)

Diagnóstico

  1. Identifique a variável especificada no elemento <Source> da política de decodificação do JWT. Essa variável precisa conter o JWT.

    Veja um exemplo de política de decodificação de JWT:

    <DecodeJWT name="JWT-Decode-HS256">
        <DisplayName>JWT Verify HS256</DisplayName>
        <Source>request.header.authorization</Source>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    </DecodeJWT>
    

    No exemplo acima, o cabeçalho de solicitação de autorização deve conter o JWT.

  2. Determine se a variável identificada na Etapa 1 está definida e disponível no fluxo em que a política de decodificação do JWT é executada.

  3. Se a variável for:

    • fora do escopo (não disponível no fluxo específico em que a política está sendo executada) ou
    • não é possível resolver (não está definida)

    essa será a causa do erro.

    No exemplo de solicitação de API abaixo, o JWT não é transmitido no cabeçalho de solicitação de autorização do usuário.

    curl -v "http://$EXTERNAL_IP/v1/decodeJWT"
    

Em que $EXTERNAL_IP é o IP do balanceador de carga externo. Esse endereço IP é exposto à Internet. Veja mais informações em Configurar o roteamento.

Because the authorization request header is not passed, the Decode JWT policy fails with the error:

```
"faultstring": "Invalid token: policy({0})"
```

Resolução

Verifique se a variável referenciada no elemento <Source> da política de decodificação de JWT está definida, contém um JWT válido (decodificável) e está disponível no fluxo específico em que a política de decodificação de JWT está sendo executada.

Para corrigir o exemplo mostrado acima, transmita um JWT válido no cabeçalho de autorização de solicitação. Para isso, faça a chamada de API usando o comando cURL da seguinte forma:

curl -v "http://$EXTERNAL_IP/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"

Em que $EXTERNAL_IP é o IP do balanceador de carga externo. Esse endereço IP é exposto à Internet. Veja mais informações em Configurar o roteamento.