エラーメッセージ
The specified alg value is not allowed
別の表記
- jwt.exceptions.InvalidAlgorithmError: The specified alg value is not allowed
PyJWT (Python) — jwt.exceptions.InvalidAlgorithmError
このエラーの意味
トークンのヘッダーにある `alg` が、`jwt.decode()` に渡した `algorithms` のリストに含まれていません。PyJWT はこれを署名の検証より前にチェックします。ヘッダーはトークンを作成した側が自由に選べるものであり、検証の方法を決めさせてはいけないからです。トークンは正しく署名されているかもしれません。ただ、許可していないアルゴリズムで署名されているだけです。
発生する理由
発行者がアルゴリズムを切り替えた
よくあるプロバイダーが RS256 から ES256 に移行すると(または EdDSA の鍵を追加すると)、古い値に固定している検証者は動作しなくなります。失敗はロールアウトの時点ちょうどから始まり、影響を受けるのは新しく発行されたトークンだけです。
JWK が別のアルゴリズムに固定されている
ときどき`PyJWK`(たとえば `PyJWKClient` から取得したもの)を渡すと、その `alg` によっても検証が制限されます。RS256 と記された JWK では、ES256 のトークンを検証できません。
別の場所から来たトークン
ときどき別の発行者のトークン、公開 API に送られた社内用の HS256 トークン、RSA で保護された API に対する `alg: "none"` や `HS256` を使ったプローブなどです。これらの場合、拒否は正しい動作です。
修正方法
- 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", )