Сообщение об ошибке
The specified alg value is not allowed
Также выводится как
- jwt.exceptions.InvalidAlgorithmError: The specified alg value is not allowed
PyJWT (Python) — jwt.exceptions.InvalidAlgorithmError
Что это означает
Значения `alg` из заголовка токена нет в списке `algorithms`, который вы передали в `jwt.decode()`. PyJWT проверяет это до проверки подписи, потому что заголовок задаётся тем, кто создал токен, и не должен определять, как этот токен проверяется. Токен может быть подписан правильно — просто алгоритмом, который вы не разрешили.
Почему это происходит
Издатель сменил алгоритм
частоПереход провайдера с RS256 на ES256 (или добавление ключа EdDSA) ломает проверяющие стороны, в которых жёстко задано старое значение. Сбои начинаются ровно в момент развёртывания и затрагивают только вновь выпущенные токены.
В JWK закреплён другой алгоритм
иногдаЕсли вы передаёте `PyJWK` (например, из `PyJWKClient`), его `alg` тоже ограничивает проверку. Ключом JWK с пометкой RS256 нельзя проверить токен ES256.
Токен из другого источника
иногдаТокены от другого издателя, внутренний токен HS256, попавший в публичный API, или пробный токен с `alg: "none"` либо `HS256` для API, защищённого RSA. В этих случаях отказ правильный.
Как исправить
- 1.
Сначала прочитайте заголовок
`jwt.get_unverified_header()` показывает `alg` и `kid`, ничему не доверяя. Сравните заголовок со своим списком разрешённых алгоритмов и с ключами, которые публикует ваш издатель.
python print(jwt.get_unverified_header(token)) # {'alg': 'ES256', 'kid': '...', 'typ': 'JWT'} - 2.
Разрешите ровно тот алгоритм, который использует издатель
Укажите в `algorithms` алгоритм, который использует ваш издатель, а ключи берите из его JWKS. Во время перехода перечислите оба алгоритма, каждый из которых сопоставлен со своим ключом по `kid`.
python from jwt import PyJWKClient jwks = PyJWKClient("https://issuer.example.com/.well-known/jwks.json") signing_key = jwks.get_signing_key_from_jwt(token) claims = jwt.decode( token, signing_key.key, algorithms=["ES256"], # the algorithm(s) your issuer actually uses, never the token's own header audience="https://api.example.com", )