Устранение ошибок декодирования токена JWT во время выполнения

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

FailedToDecode

Код ошибки

steps.jwt.FailedToDecode

Тело ответа с ошибкой

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

Причина

Эта ошибка возникает, если веб-токен JSON (JWT), указанный в элементе <Source> правила Decode JWT, имеет неверный формат, недействителен или не может быть декодирован.

Правильно структурированный токен JWT должен содержать заголовок, полезную нагрузку и подпись в следующем формате: header.payload.signature. Если в JWT, переданном правилу DecodeJWT, отсутствует какой-либо компонент, вы получите ошибку. Например, если в JWT есть только payload.signature, но отсутствует header, возникнет ошибка.

диагностика;

  1. Определите переменную, указанную в элементе <Source> правила Decode JWT. Эта переменная должна содержать JWT.

    Вот пример правил Decode JWT:

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

    В приведенном выше примере JWT должен быть указан в заголовке запроса Authorization.

  2. Проверьте переменную, указанную на шаге 1, и убедитесь, что содержащийся в ней JWT действителен. Если входной JWT-токен недействителен, это и будет причиной ошибки.

    В приведенном ниже примере запроса к API входной JWT передается в заголовке запроса Authorization:

    curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT" -H "Authorization: Bearer eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"
    

    При проверке JWT было обнаружено, что он имеет недопустимый формат payload.signature. Ожидаемый формат JWT: header.payload.signature. В результате политика Decode JWT завершается с ошибкой :

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

Разрешение

Убедитесь, что JWT, переданный в правило Decode JWT, содержит все три элемента, имеет правильный формат и может быть декодирован.

Чтобы исправить пример, приведенный выше, можно передать действительный JWT в формате header.payload.signature. Для этого можно выполнить вызов API с помощью команды cURL, как показано ниже:

curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"

InvalidToken

Код ошибки

steps.jwt.InvalidToken

Тело ответа с ошибкой

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

Причина

Эта ошибка возникает, если переменная потока, указанная в элементе <Source> правила Decode JWT:

  • недоступно (не поддерживается в определенном процессе, в котором выполняется правило);
  • не может быть разрешен (не определен);

диагностика;

  1. Определите переменную, указанную в элементе <Source> правила Decode JWT. Эта переменная должна содержать JWT.

    Вот пример правил Decode JWT:

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

    В приведенном выше примере заголовок запроса авторизации должен содержать JWT.

  2. Определите, задана ли переменная, указанная на шаге 1, и доступна ли она в потоке, в котором выполняется правило Decode JWT.

  3. Если переменная:

    • недоступно (не поддерживается в определенном процессе, в котором выполняется правило);
    • не может быть разрешен (не определен);

    то это и есть причина ошибки.

    В примере запроса к API ниже пользователь не передает JWT в заголовке запроса авторизации.

    curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT"
    

    Поскольку заголовок запроса авторизации не передается, правило Decode JWT завершается с ошибкой:

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

Разрешение

Убедитесь, что переменная, на которую ссылается элемент <Source> правила Decode JWT, определена, содержит действительный (декодируемый) токен JWT и доступна в определенном потоке, в котором выполняется правило Decode JWT.

Чтобы исправить приведенный выше пример, передайте действительный JWT в заголовке авторизации запроса. Для этого можно выполнить вызов API с помощью команды cURL, как показано ниже:

curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"