Сообщение об ошибке
It is required that you pass in a value for the "algorithms" argument when calling decode().
PyJWT (Python) — jwt.exceptions.DecodeError
Что это означает
Начиная с PyJWT 2.0, jwt.decode() отказывается работать без явно переданного списка algorithms. Это не придирка: если брать алгоритм из заголовка самого токена, становятся возможны атаки с подменой алгоритма (например, проверка токена HS256, при которой открытый ключ RSA используется как секрет HMAC). Проверяющая сторона — её настраивают на сервере, вне досягаемости атакующего — должна сама указать, что она принимает, и PyJWT закрепляет это требование на уровне API, так что небезопасную форму вызова просто невозможно написать.
Почему это происходит
Код, написанный для PyJWT 1.x
частоPyJWT 1.x позволял вызывать jwt.decode(token, key) и сам угадывал алгоритм. В релизе 2.0 (2020) параметр algorithms стал обязательным; после любого обновления зависимостей, при котором PyJWT переходит через эту границу, в коде, который раньше работал, появляется эта ошибка.
Параметр пропущен во фрагменте кода из учебника или от LLM
частоВо многих старых примерах в интернете до сих пор вызывают decode() с двумя аргументами. Такой фрагмент нормально работает в окружениях, где закреплена версия PyJWT 1.x, и завершается ошибкой в любой современной установке.
Вызов decode спрятан в общей вспомогательной функции аутентификации
иногдаЕсли jwt.decode() обёрнут в небольшую внутреннюю утилиту, обновление PyJWT разом ломает все сервисы, которые импортируют эту вспомогательную функцию, и трассировка стека указывает на обёртку, а не на вызывающий код. Интеграции с фреймворками (Flask-JWT-Extended, DRF SimpleJWT) сами передают algorithms (список алгоритмов) — обычно параметр теряется именно в самописных обёртках.
Как исправить
- 1.
Укажите алгоритм явно
Передайте ровно тот алгоритм (или алгоритмы), который использует ваш издатель, — для токенов, подписанных ECDSA, обычно это ES256. Если через один сервис проходят токены нескольких типов, задайте для каждого издателя собственный список разрешённых алгоритмов, а не объединяйте их все в один слишком широкий список.
python import jwt payload = jwt.decode( token, public_key_pem, algorithms=["ES256"], # required — and a security control, not boilerplate audience="api://orders", ) - 2.
Если нужен просмотр без проверки, укажите это явно
Если нужно только прочитать утверждения (при отладке, для журналирования), отключите проверку осознанно — и никогда не используйте результат для решений об авторизации.
python claims = jwt.decode(token, options={"verify_signature": False}) # or just the header: header = jwt.get_unverified_header(token)