python-jose реализует JWS, JWE, JWK и JWT со сменными бэкендами: ecdsa на чистом Python, pycryptodome или cryptography; для проверки установили набор опциональных зависимостей cryptography. Благодаря многолетним руководствам по FastAPI и Flask библиотека широко распространена, но развивается медленно: 3.4.0 (февраль 2025 года) вышла почти через 4 года после 3.3.0, и новые проекты обычно выбирают PyJWT, jwcrypto или joserfc.
В jwt.decode() аргумент algorithms необязателен, и без него алгоритм берётся из заголовка токена. Вместе с проблемой, которую описывает опубликованный в сентябре 2026 года бюллетень безопасности GHSA-3qf3-8w2g-rqmx (CVE-2026-85394) и которая не исправлена в 3.5.0, этим можно воспользоваться на практике: защита от использования открытых ключей как секретов HMAC распознаёт текст PEM и OpenSSH, но не тот же ключ в виде байтов DER. В ходе проверки это удалось воспроизвести: токен HS256, ключом HMAC для которого служил открытый ключ в DER, прошёл проверку этим ключом, когда algorithms не передавали, и был отклонён с ошибкой The specified alg value is not allowed, как только передали algorithms=["ES256"]. Всегда передавайте algorithms, храните открытые ключи как строки PEM и проверяйте секреты инструментом проверки секретов JWT.
Набор алгоритмов самый устаревший среди библиотек для Python: только семейства HS, RS и ES. PS256, EdDSA и ES256K вызывают Algorithm … not supported., поэтому токены от поставщиков, перешедших на Ed25519 или RSA-PSS, проверить нельзя. К тому же ES256 не привязан к P-256: ключ P-384 дал 96-байтовую подпись с заголовком ES256, которую python-jose принял при проверке, а другие библиотеки, например jose и PyJWT, отклоняют.
Подписи ES256 — это 64 байта в формате raw r‖s, а подпись DER не проходит проверку с ошибкой Signature verification failed.; в каком формате подпись в токене, показывает отладчик JWT. exp необязателен, а допуск на расхождение часов равен нулю, если не задать require_exp и leeway в options, как в примере.
Неподписанные токены отклонялись с ошибкой Unable to find an algorithm for key, даже с algorithms=["none"].