Resolução de problemas de erros de tempo de execução de JWTs de descodificação

Está a ver a documentação do Apigee e do Apigee Hybrid.
Ver documentação do Apigee Edge.

FailedToDecode

Código de erro

steps.jwt.FailedToDecode

Corpo da resposta de erro

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

Causa

Este erro ocorre se o símbolo da Web JSON (JWT) especificado no elemento <Source> da política Decode JWT tiver um formato incorreto, for inválido ou não for descodificável.

Um JWT estruturado corretamente deve conter um cabeçalho, um payload e uma assinatura no seguinte formato: header.payload.signature. Se o JWT transmitido para a política DecodeJWT não tiver um componente, recebe o erro. Por exemplo, se o JWT tiver apenas payload.signature, mas não tiver o respetivo header, ocorre o erro.

Diagnóstico

  1. Identifique a variável especificada no elemento <Source> da política Decode JWT. Esta variável deve conter o JWT.

    Segue-se um exemplo de uma política de descodificaçã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 do pedido de autorização.

  2. Examine a variável identificada no passo 1 e verifique se o JWT que contém é válido. Se o JWT de entrada não for válido, esse é o motivo do erro.

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

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

    Em que $EXTERNAL_IP é o endereço IP do balanceador de carga externo. Este endereço IP está exposto à Internet. Para mais informações, consulte o artigo Personalize o encaminhamento de acesso.

    Uma análise detalhada do JWT mostra que tem o formato payload.signature, que é inválido. O formato esperado do JWT é header.payload.signature. Consequentemente, a política Decode JWT falha com o erro :

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

Resolução

Certifique-se de que o JWT transmitido para a política Decode JWT contém todos os três elementos, tem o formato correto e é descodificável.

Para corrigir o exemplo apresentado acima, pode transmitir um JWT válido com o formato header.payload.signature. Isto pode ser feito através da chamada da API com 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 endereço IP do balanceador de carga externo. Este endereço IP está exposto à Internet. Para mais informações, consulte o artigo Personalize o encaminhamento de acesso.

InvalidToken

Código de erro

steps.jwt.InvalidToken

Corpo da resposta de erro

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

Causa

Este erro ocorre se a variável de fluxo especificada no elemento <Source> da política Decode JWT:

  • Fora do âmbito (não disponível no fluxo específico em que a política está a ser executada) ou
  • não é possível resolver (não está definido)

Diagnóstico

  1. Identifique a variável especificada no elemento <Source> da política Decode JWT. Esta variável deve conter o JWT.

    Segue-se um exemplo de uma política de descodificaçã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 do pedido de autorização deve conter o JWT.

  2. Determine se a variável identificada no passo 1 está definida e disponível no fluxo em que a política Decode JWT é executada.

  3. Se a variável for:

    • Fora do âmbito (não disponível no fluxo específico em que a política está a ser executada) ou
    • não é possível resolver (não está definido)

    Nesse caso, essa é a causa do erro.

    No pedido de API de exemplo abaixo, o JWT não é transmitido no cabeçalho do pedido de autorização pelo utilizador.

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

Em que $EXTERNAL_IP é o endereço IP do balanceador de carga externo. Este endereço IP está exposto à Internet. Para mais informações, consulte o artigo Personalize o encaminhamento de acesso.

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

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

Resolução

Certifique-se de que a variável referenciada no elemento <Source> da política Decode JWT está definida, contém um JWT válido (decodificável) e está disponível no fluxo específico onde a política Decode JWT está a ser executada.

Para corrigir o exemplo apresentado acima, pode transmitir um JWT válido no cabeçalho de autorização do pedido. Isto pode ser feito através da chamada da API com 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 endereço IP do balanceador de carga externo. Este endereço IP está exposto à Internet. Para mais informações, consulte o artigo Personalize o encaminhamento de acesso.