本文へスキップ
ecdsa.com
PyJWT (Python)JWT ライブラリ

エラーメッセージ

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 のレベルで強制しているので、安全でない呼び出し方はそもそも書けません。

発生する理由

修正方法

  1. 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. 2.

    検証せずに中身を確認するだけなら、そのことを明示する

    クレームを読むだけでよい場合(デバッグ、ログ出力)は、意図して検証を無効にしてください。ただし、その結果を認可の判断に使ってはいけません。

    python
    claims = jwt.decode(token, options={"verify_signature": False})
    # or just the header:
    header = jwt.get_unverified_header(token)

関連するエラー

署名エラーデータベースをすべて見る