Résoudre les problèmes d'erreur d'exécution de la règle BasicAuthentication

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

UnresolvedVariable

Code d'erreur

steps.basicauthentication.UnresolvedVariable

Corps de la réponse d'erreur

{
    "fault": {
        "faultstring": "Unresolved variable : [variable_name]",
        "detail": {
            "errorcode": "steps.basicauthentication.UnresolvedVariable"
        }
    }
}

Exemple de message d'erreur

{
    "fault": {
        "faultstring": "Unresolved variable : request.header.Authorization",
        "detail": {
            "errorcode": "steps.basicauthentication.UnresolvedVariable"
        }
    }
}

Cause

Cette erreur se produit si la variable contenant la chaîne encodée en base64 spécifiée dans l'élément <Source> de la règle d'authentification de base est l'un des éléments suivants :

  • est hors de portée (non disponible dans le flux spécifique où la règle est exécutée)
  • impossible à résoudre (non définie)

Par exemple, cette erreur se produit si la règle BasicAuthentication a une variable spécifiée comme request.header.Authorization dans l'élément <Source>, mais que l'en-tête Authorization n'est pas transmis dans le cadre de la requête API.

Diagnostic

  1. Identifiez la variable utilisée pour l'élément <Source> dans la règle BasicAuthentication. Vous trouverez ces informations dans l'élément faultstring de la réponse d'erreur. Par exemple, dans l'exemple faultstring, suivant, la variable utilisée pour l'élément <Source> est request.header.Authorization :

    "faultstring": "Unresolved variable : request.header.Authorization"
    
  2. Examinez toutes les règles de BasicAuthentication dans le proxy d'API spécifique où l'échec a eu lieu. Il peut y avoir une ou plusieurs règles BasicAuthentication. Identifiez la ou les règles BasicAuthentication spécifiques dans lesquelles la variable spécifiée dans l'élément <Source> correspond au nom de la variable identifiée dans la chaîne d'erreur (étape 1 ci-dessus).

    Par exemple, la règle suivante définit l'élément <Source> sur une variable nommée request.header.Authorization, qui correspond au contenu de faultstring :

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <BasicAuthentication name="DecodeBaseAuthHeaders">
      <DisplayName>Decode Basic Authentication Header</DisplayName>
      <Operation>Decode</Operation>
      <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
      <User ref="request.header.username"/>
      <Password ref="request.header.password"/>
      <Source>request.header.Authorization</Source>
    </BasicAuthentication>
    
  3. Déterminez si la variable est définie et disponible dans le flux dans lequel la règle BasicAuthentication est exécutée.

  4. Si la variable est :

    1. est hors de portée (non disponible dans le flux spécifique où la règle est exécutée)
    2. impossible à résoudre (non définie)

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

    Dans l'exemple de règle BasicAuthentication présenté ci-dessus, la variable request.header.Authorization n'a pas été transmise dans le cadre de la requête. Cela signifie que la requête d'API a été effectuée sans l'en-tête Authorization, comme illustré ci-dessous:

    curl -v "http://$EXTERNAL_IP/basicauth"

    $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 Personnaliser le routage des accès.

    Comme la variable utilisée dans la règle BasicAuthentication n'est pas disponible, vous recevez le code d'erreur :

    steps.basicauthentication.UnresolvedVariable
    

Solution

Vérifiez que la variable utilisée dans la règle BasicAuthentication est définie ou transmise en tant qu'entrée et disponible dans le flux où l'exécution de la règle est effectuée.

Pour résoudre le problème avec l'exemple de règle BasicAuthentication décrit ci-dessus, envoyez une requête API comme indiqué ci-dessous :

curl -v "http://$EXTERNAL_IP/basicauth" -H "Authorization: Basic YWthc2g6MTIz"

$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 Personnaliser le routage des accès.

InvalidBasicAuthenticationSource

Code d'erreur

steps.basicauthentication.InvalidBasicAuthenticationSource

Corps de la réponse d'erreur

{
    "fault": {
        "faultstring": "Source variable : [variable_name] for basic authentication decode policy is not valid",
        "detail": {
            "errorcode": "steps.basicauthentication.InvalidBasicAuthenticationSource"
        }
    }
}

Exemple de message d'erreur

{
    "fault": {
        "faultstring": "Source variable : request.header.Authorization for basic authentication decode policy is not valid",
        "detail": {
            "errorcode": "steps.basicauthentication.InvalidBasicAuthenticationSource"
        }
    }
}

Causes possibles

Les causes possibles de cette erreur sont les suivantes :

Cause Description
Variable source non valide La variable d'entrée source d'une règle BasicAuthentication n'est pas une chaîne valide encodée en base64.
L'en-tête est incorrect L'en-tête contenant la chaîne encodée en base64 transmise à la règle BasicAuthentication est incorrect.

Cause : variable source non valide

Cette erreur se produit si la variable contenant la chaîne encodée en base64 spécifiée dans l'élément <Source> de la règle BasicAuthentication ne contient pas de valeur valide.

Par exemple, cette erreur se produit si la variable spécifiée dans l'élément <Source> de la règle BasicAuthentication ne comporte pas de chaîne encodée en base64 valide.

Diagnostic

  1. Identifiez la variable utilisée pour l'élément <Source> dans la règle BasicAuthentication. Vous trouverez ces informations dans l'élément faultstring de la réponse d'erreur. Par exemple, dans l'exemple faultstring, suivant, la variable utilisée pour l'élément <Source> est request.header.Authorization :

    "faultstring": "Source variable : request.header.Authorization for basic authentication decode policy is not valid"
    
  2. Examinez toutes les règles de BasicAuthentication dans le proxy d'API spécifique où l'échec a eu lieu. Il peut y avoir une ou plusieurs règles BasicAuthentication. Identifiez la ou les règles BasicAuthentication spécifiques dans lesquelles la variable spécifiée dans l'élément <Source> correspond au nom de la variable identifiée dans la chaîne d'erreur (étape 1 ci-dessus).

    Par exemple, la règle suivante définit l'élément <Source> sur une variable nommée request.header.Authorization, qui correspond au contenu de faultstring :

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <BasicAuthentication name="DecodeBaseAuthHeaders">
        <DisplayName>Decode Basic Authentication Header</DisplayName>
        <Operation>Decode</Operation>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
        <User ref="request.header.username"/>
        <Password ref="request.header.password"/>
        <Source>request.header.Authorization</Source>
    </BasicAuthentication>
    
  3. Si la valeur stockée dans la variable spécifiée dans l'élément <Source> n'est pas une chaîne valide encodée en base64, alors c'est la cause de l'erreur.

    Dans l'exemple de règle BasicAuthentication présenté ci-dessus, la variable request.header.Authorization envoyée par le client en tant qu'en-tête n'était pas valide, comme indiqué ci-dessous:

    curl -v "http://$EXTERNAL_IP /basicauth" -H "Authorization: Basic 23435"

    $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 Personnaliser le routage des accès.

    Comme la variable request.header.Authorization contient une chaîne 23435" non valide encodée en base64, vous recevez le code d'erreur :

    steps.basicauthentication.InvalidBasicAuthenticationSource

Solution

Vérifiez que la variable spécifiée pour l'élément <Source> dans la règle BasicAuthentication dispose d'une chaîne valide encodée en base64.

Pour résoudre le problème avec l'exemple de règle BasicAuthentication décrit ci-dessus, envoyez une requête API en transmettant une chaîne valide encodée en base64 dans l'en-tête Authorization comme illustré ci-dessous :

curl -v "http://$EXTERNAL_IP/basicauth" -H "Authorization: Basic YWthc2g6MTIz"

$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 Personnaliser le routage des accès.

Cause : l'en-tête est incorrect/non valide

Cette erreur se produit si l'en-tête transmis à la règle BasicAuthentication est incorrect ou non valide.

Par exemple, cette erreur se produit si la règle BasicAuthentication a une variable spécifiée comme request.header.Authorization dans l'élément <Source> et que l'en-tête transmis dans le cadre de la requête API est incorrect/non valide.

Diagnostic

  1. Identifiez la variable utilisée pour l'élément <Source> dans la règle BasicAuthentication. Vous trouverez ces informations dans l'élément faultstring de la réponse d'erreur. Par exemple, dans l'exemple <Source> suivant, la variable utilisée pour l'élément request.header.Authorization est :

    "faultstring": "Source variable : request.header.Authorization for basic authentication decode policy is not valid"
    
  2. Examinez toutes les règles de BasicAuthentication dans le proxy d'API spécifique où l'échec a eu lieu. Il peut y avoir une ou plusieurs règles BasicAuthentication. Identifiez la ou les règles BasicAuthentication spécifiques dans lesquelles la variable spécifiée dans l'élément <Source> correspond au nom de la variable identifiée dans la chaîne d'erreur (étape 1 ci-dessus).

    Par exemple, la règle suivante définit l'élément <Source> sur une variable nommée request.header.Authorization, qui correspond au contenu de faultstring :

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <BasicAuthentication name="DecodeBaseAuthHeaders">
        <DisplayName>Decode Basic Authentication Header</DisplayName>
        <Operation>Decode</Operation>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
        <User ref="request.header.username"/>
        <Password ref="request.header.password"/>
        <Source>request.header.Authorization</Source>
    </BasicAuthentication>
    
  3. Si la variable est un en-tête et qu'elle est incorrecte ou non valide (elle ne présente pas le type d'authentification ou si le type d'authentification n'est pas "Basic"), alors c'est la cause de l'erreur.

    L'en-tête "Authorization" se présente sous la forme suivante :

    Authorization: <Authentication type> <credentials>
    

    Un en-tête incorrect peut être transmis à la règle BasicAuthentication de deux manières :

    Exemple 1: Aucun type d'authentification dans l'en-tête:

    curl -v "http://$EXTERNAL_IP/basicauth" -H "Authorization: YWthc2g6MTIz"

    $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 Personnaliser le routage des accès.

    Dans l'exemple ci-dessus, l'en-tête "Authorization" ne présente pas le type "Authentication" (Authentification). Si cet en-tête est transmis à la règle BasicAuthentication indiquée ci-dessus, vous recevez le code d'erreur suivant :

    steps.basicauthentication.InvalidBasicAuthenticationSource
    

    Exemple 2: le type d'authentification n'est pas de type "Basic":

    curl -v "http://$EXTERNAL_IP/basicauth" -H "Authorization: OAuth YWthc2g6MTIz"

    $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 Personnaliser le routage des accès.

    Dans l'exemple ci-dessus, l'en-tête "Authorization" ne présente pas le type d'authentification "Basic". Si cette valeur est transmise à la règle BasicAuthentication affichée ci-dessus, vous recevez le code d'erreur suivant :

    steps.basicauthentication.InvalidBasicAuthenticationSource
    

    De même, cette erreur peut se produire si le type d'authentification tel que Bearer, Digest Auth, etc. est utilisé dans l'en-tête Authorization.

Solution

Assurez-vous que l'en-tête dans lequel l'entrée de la règle BasicAuthentication est transmise a pour type d'authentification "Basic".

Pour résoudre le problème avec l'exemple de règle BasicAuthentication décrit ci-dessus, envoyez une requête API en transmettant une chaîne valide encodée en base64 avec le type d'authentification "Basic" dans l'en-tête Authorization, comme indiqué ci-dessous :

curl -v "http://$EXTERNAL_IP/basicauth" -H "Authorization: Basic YWthc2g6MTIz"

$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 Personnaliser le routage des accès.