Solucionar problemas de errores de tiempo de ejecución de decodificación de JWT

Estás consultando la documentación de Apigee y Apigee Hybrid.
Consulta la documentación de Apigee Edge.

FailedToDecode

Código de error

steps.jwt.FailedToDecode

Cuerpo de respuesta de error

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

Causa

Este error se produce si el JSON Web Token (JWT) especificado en el elemento <Source> de la política Decode JWT tiene un formato incorrecto, no es válido o no se puede decodificar.

Un JWT correctamente estructurado debe contener un encabezado, una carga útil y una firma con el siguiente formato: header.payload.signature. Si falta alguna parte del componente del JWT que se ha enviado a la política DecodeJWT, se producirá un error. Por ejemplo, si el JWT solo tiene payload.signature, pero le falta header, se producirá un error.

Diagnóstico

  1. Identifica la variable especificada en el elemento <Source> de la política Decodificar JWT. Esta variable debe contener el JWT.

    A continuación, se muestra un ejemplo de política de decodificación de JWT:

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

    En el ejemplo anterior, el JWT debe estar incluido en el encabezado de la solicitud de autorización.

  2. Examina la variable identificada en el paso 1 y comprueba si el JWT que contiene es válido. Si el JWT de entrada no es válido, ese es el motivo del error.

    En la solicitud de API de ejemplo que se muestra a continuación, el JWT de entrada se transfiere en el encabezado de solicitud Authorization:

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

    Donde $EXTERNAL_IP es la dirección IP del balanceador de carga externo. Esta dirección IP está expuesta a Internet. Para obtener más información, consulta Personalizar el enrutamiento de acceso.

    Si examinas detenidamente el JWT, verás que tiene el formato payload.signature, que no es válido. El formato esperado del JWT es header.payload.signature. Por lo tanto, la política Decodificar JWT falla y devuelve el siguiente error :

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

Resolución

Asegúrate de que el JWT que se ha enviado a la política Decodificar JWT contenga los tres elementos, tenga el formato correcto y se pueda decodificar.

Para corregir el ejemplo que se muestra arriba, puedes enviar un JWT válido con el formato header.payload.signature. Para ello, haga la llamada a la API con el comando cURL de la siguiente manera:

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

Donde $EXTERNAL_IP es la dirección IP del balanceador de carga externo. Esta dirección IP está expuesta a Internet. Para obtener más información, consulta Personalizar el enrutamiento de acceso.

InvalidToken

Código de error

steps.jwt.InvalidToken

Cuerpo de respuesta de error

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

Causa

Este error se produce si la variable de flujo especificada en el elemento <Source> de la política Decodificar JWT:

  • Fuera del ámbito (no disponible en el flujo específico en el que se está ejecutando la política) o
  • no se puede resolver (no está definido)

Diagnóstico

  1. Identifica la variable especificada en el elemento <Source> de la política Decodificar JWT. Esta variable debe contener el JWT.

    A continuación, se muestra un ejemplo de política de decodificación de JWT:

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

    En el ejemplo anterior, el encabezado de la solicitud de autorización debe contener el JWT.

  2. Determina si la variable identificada en el paso 1 está definida y disponible en el flujo en el que se ejecuta la política Decodificar JWT.

  3. Si la variable es:

    • Fuera del ámbito (no disponible en el flujo específico en el que se está ejecutando la política) o
    • no se puede resolver (no está definido)

    entonces, esa es la causa del error.

    En la solicitud de API de ejemplo que se muestra a continuación, el usuario no incluye el JWT en el encabezado de la solicitud de autorización.

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

Donde $EXTERNAL_IP es la dirección IP del balanceador de carga externo. Esta dirección IP está expuesta a Internet. Para obtener más información, consulta Personalizar el enrutamiento de acceso.

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

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

Resolución

Asegúrate de que la variable a la que se hace referencia en el elemento <Source> de la política Decodificar JWT esté definida, contenga un JWT válido (decodificable) y esté disponible en el flujo específico en el que se esté ejecutando la política Decodificar JWT.

Para corregir el ejemplo anterior, puedes enviar un JWT válido en el encabezado de autorización de la solicitud. Para ello, haga la llamada a la API con el comando cURL de la siguiente manera:

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

Donde $EXTERNAL_IP es la dirección IP del balanceador de carga externo. Esta dirección IP está expuesta a Internet. Para obtener más información, consulta Personalizar el enrutamiento de acceso.