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

エラーメッセージ

Audience doesn't match

別の表記

  • jwt.exceptions.InvalidAudienceError: Audience doesn't match

PyJWT (Python) — jwt.exceptions.InvalidAudienceError

このエラーの意味

トークンには `aud` クレームがあり、`jwt.decode()` には `audience=` を渡していますが、一致する値が 1 つもありません。PyJWT は、トークンのオーディエンスの少なくとも 1 つが、許可したオーディエンスのいずれかと等しい場合にトークンを受け入れますが、今回はどれも一致しませんでした。署名は有効でしたが、トークンは別の受信者向けに発行されたものです。

発生する理由

修正方法

  1. 1.

    トークンの aud と、設定したオーディエンスを比較する

    検証なしのデコードは中身の確認にだけ使い、そのうえで正確な識別子を指定して検証してください。トークンが誤ったオーディエンス向けに発行されていた場合はクライアントのトークンリクエストを、識別子のつづりが間違っていた場合は検証者を修正してください。

    python
    unverified = jwt.decode(token, options={"verify_signature": False})
    print(repr(unverified.get("aud")))  # str or list[str]
    
    claims = jwt.decode(
        token,
        signing_key,
        algorithms=["ES256"],
        audience="https://api.example.com/orders",  # must equal one of the token's aud values
        issuer="https://issuer.example.com/",
    )
  2. 2.

    複数の識別子を明示的に許可する

    `audience` にはリストを指定できます。1 つの API が正当に複数の識別子を持つ場合はリストを使ってください。エラーを消すために `options={"verify_aud": False}` を渡してはいけません。

    python
    # Any one of these may appear in the token's aud.
    claims = jwt.decode(token, signing_key, algorithms=["ES256"], audience=["orders-api", "https://api.example.com/orders"])

関連するエラー

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