Résoudre les erreurs d'exécution de la règle DecodeJWT

Vous consultez la documentation d'Apigee et d'Apigee hybrid.
Consultez la documentation d'Apigee Edge.

FailedToDecode

Code d'erreur

steps.jwt.FailedToDecode

Corps de la réponse d'erreur

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

Cause

Cette erreur se produit si le jeton Web JSON (JWT) spécifié dans l'élément <Source> de la règle DecodeJWT est incorrect, non valide ou indécodable.

Un jeton JWT correctement structuré doit contenir un en-tête, une charge utile et une signature au format suivant : header.payload.signature. Si un composant est manquant dans le jeton JWT transmis dans la règle DecodeJWT, l'erreur s'affiche. Par exemple, si le jeton JWT ne contient que payload.signature, sans le paramètre header, l'erreur survient.

Diagnostic

  1. Identifiez la variable spécifiée dans l'élément <Source> de la règle DecodeJWT. Cette variable doit contenir le jeton JWT.

    Voici un exemple de règle DecodeJWT :

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

    Dans l'exemple ci-dessus, le jeton JWT doit être contenu dans l'en-tête de requête Authorization.

  2. Examinez la variable identifiée à l'étape 1 et vérifiez si le jeton JWT qu'il contient est valide. Si le jeton d'entrée JWT n'est pas valide, il s'agit de la cause de l'erreur.

    Dans l'exemple de requête API ci-dessous, le jeton d'entrée JWT est transmis dans l'en-tête de la requête d'autorisation :

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

    $EXTERNAL_IP est l'adresse IP de l'équilibreur de charge externe. Cette adresse IP est exposée sur Internet. Pour plus d'informations, consultez la page Configurer le routage.

    Un examen minutieux du jeton JWT montre qu'il est au format payload.signature, qui n'est pas valide. Le format attendu pour le jeton JWT est header.payload.signature. Par conséquent, la règle DecodeJWT échoue avec l'erreur suivante :

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

Solution

Assurez-vous que le jeton JWT transmis dans la règle DecodeJWT contient les trois éléments, qu'il est correctement formaté et qu'il peut être décodé.

Pour corriger l'exemple présenté ci-dessus, vous pouvez transmettre un jeton JWT valide au format header.payload.signature. Pour ce faire, effectuez l'appel d'API à l'aide de la commande cURL comme suit :

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

$EXTERNAL_IP est l'adresse IP de l'équilibreur de charge externe. Cette adresse IP est exposée sur Internet. Pour plus d'informations, consultez la page Configurer le routage.

InvalidToken

Code d'erreur

steps.jwt.InvalidToken

Corps de la réponse d'erreur

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

Cause

Cette erreur se produit si la variable de flux spécifiée dans l'élément <Source> de la règle DecodeJWT est :

  • hors du champ d'application (non disponible dans le flux spécifique où la règle est exécutée) ; ou
  • impossible à résoudre (non définie).

Diagnostic

  1. Identifiez la variable spécifiée dans l'élément <Source> de la règle DecodeJWT. Cette variable doit contenir le jeton JWT.

    Voici un exemple de règle DecodeJWT :

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

    Dans l'exemple ci-dessus, l'en-tête de requête Authorization doit contenir le jeton JWT.

  2. Déterminez si la variable identifiée à l'étape 1 est définie et disponible dans le flux dans lequel la règle DecodeJWT est exécutée.

  3. Si la variable est :

    • hors du champ d'application (non disponible dans le flux spécifique où la règle est exécutée), ou
    • impossible à résoudre (non définie),

    alors il s'agit de la cause de l'erreur.

    Dans l'exemple de requête API ci-dessous, le jeton JWT n'est pas transmis par l'utilisateur dans l'en-tête de requête d'autorisation.

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

$EXTERNAL_IP est l'adresse IP de l'équilibreur de charge externe. Cette adresse IP est exposée sur Internet. Pour plus d'informations, consultez la page Configurer le routage.

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

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

Solution

Assurez-vous que la variable référencée dans l'élément <Source> de la règle DecodeJWT est définie, qu'elle contient un jeton JWT valide (décodable) et qu'elle est disponible dans le flux spécifique où la règle DecodeJWT est exécutée.

Pour corriger l'exemple présenté ci-dessus, vous pouvez transmettre un jeton JWT valide dans l'en-tête de la requête d'autorisation. Pour ce faire, effectuez l'appel d'API à l'aide de la commande cURL comme suit :

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

$EXTERNAL_IP est l'adresse IP de l'équilibreur de charge externe. Cette adresse IP est exposée sur Internet. Pour en savoir plus, consultez la page Configurer le routage.