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

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

FailedToDecode

Код ошибки

steps.jwt.FailedToDecode

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

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

Причина

Эта ошибка возникает, если JSON Web Token (JWT), указанный в элементе <Source> политики Decode 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-токен передается в заголовке запроса Authorization:

    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"

InvalidToken

Код ошибки

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"