Сообщение об ошибке
Expected a different algorithm (JWT::IncorrectAlgorithm)
Также выводится как
- JWT::IncorrectAlgorithm: Expected a different algorithm
ruby-jwt (Ruby) — JWT::IncorrectAlgorithm from JWT.decode
Что это означает
Алгоритма из заголовка `alg` токена нет среди разрешённых вами, а если параметр `algorithm:`/`algorithms:` вообще не передан, ruby-jwt не разрешает ни одного. Начиная с ruby-jwt 2.x проверяющая сторона должна явно указать алгоритм: доверие к заголовку самого токена лежит в основе известных атак с подменой алгоритма. Подпись не проверялась.
Почему это происходит
В JWT.decode не передан алгоритм
частоКод из руководств по ruby-jwt 1.x вызывает `JWT.decode(token, key, true)`. В таком случае текущие версии отклоняют любой токен с этой ошибкой.
Издатель использует не тот алгоритм, что указан в настройках
частоПереход издателя с RS256 на ES256 (или с HS256 на асимметричный алгоритм) ломает проверяющие стороны, в которых по-прежнему жёстко задано старое значение.
Токен другого издателя или пробный запрос
иногдаТокены с `alg: none` или `HS256`, отправленные в API, который проверяет RS256/ES256, отклоняются здесь — как и должно быть.
Как исправить
- 1.
Явно укажите алгоритм издателя
Передайте `algorithm:` (или `algorithms:` для короткого списка). Если алгоритмов несколько, используйте загрузчик JWKS, чтобы каждый токен проверялся ключом подходящего типа.
ruby payload, header = JWT.decode(token, public_key, true, algorithm: "ES256") # several allowed algorithms (e.g. during a migration), each matched to the right key type: payload, header = JWT.decode(token, nil, true, algorithms: ["ES256", "RS256"], jwks: jwks_loader)