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

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

Фауледтодекодировать

Код ошибки

steps.jwt.FailedToDecode

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

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

Причина

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

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

Диагностика

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

    Вот пример политики декодирования JWT:

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

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

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

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

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

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

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

Разрешение

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

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

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

Инвалидтокен

Код ошибки

steps.jwt.InvalidToken

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

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

Причина

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

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

Диагностика

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

    Вот пример политики декодирования JWT:

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

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

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

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

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

    тогда это причина ошибки.

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

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

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

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

Разрешение

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

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

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