エラーメッセージ
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 のリストを明示しないと実行を拒否します。これは杓子定規な制約ではありません。トークン自身のヘッダーからアルゴリズムを決めると、アルゴリズム混同攻撃が可能になります(たとえば、RSA 公開鍵を HMAC シークレットとして使って HS256 トークンを検証させる攻撃)。受け入れるものを明示しなければならないのは検証者(サーバー側で設定され、攻撃者の手が届かないもの)であり、PyJWT はこの取り決めを API のレベルで強制しているので、安全でない呼び出し方はそもそも書けません。
発生する理由
PyJWT 1.x 向けに書かれたコード
よくあるPyJWT 1.x では jwt.decode(token, key) という呼び出しが許され、アルゴリズムは推測されていました。2.0 のリリース(2020年)で algorithms が必須になったため、この境界をまたいで依存関係を更新すると、それまで動作していたコードでこのエラーが発生します。
チュートリアルや LLM が生成したスニペットで省略されている
よくあるWeb 上の古い例の多くは、今でも引数が 2 つの decode() の呼び出しを示しています。このスニペットは PyJWT 1.x に固定された環境では問題なく動作しますが、最新のインストールではどこでも失敗します。
共有の認証ヘルパーが decode の呼び出しを隠している
ときどき小さな社内ユーティリティが jwt.decode() をラップしていると、PyJWT をアップグレードしたときに、そのヘルパーをインポートしているすべてのサービスが一斉に動作しなくなり、トレースバックも呼び出し元のコードではなくラッパーを指します。フレームワークの統合(Flask-JWT-Extended、DRF SimpleJWT)は内部で algorithms を渡すので、省略が起きるのはたいてい自作のラッパーです。
修正方法
- 1.
アルゴリズムを明示的に指定する
発行者が使うアルゴリズムだけを正確に渡してください。ECDSA で署名されたトークンなら、通常は ES256 です。1 つのサービスを複数の種類のトークンが通る場合は、すべてを 1 つの緩いリストにまとめるのではなく、発行者ごとに個別の許可リストを用意してください。
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)