エラーメッセージ
Invalid audience
別の表記
- jwt.exceptions.InvalidAudienceError: Invalid audience
「Audience doesn't match」と比べてください。そちらは、`audience` は渡したものの、一致する値がなかったことを意味します。
PyJWT (Python) — jwt.exceptions.InvalidAudienceError
このエラーの意味
トークンには `aud` クレームが含まれていますが、`jwt.decode()` は `audience` 引数なしで呼び出されました。PyJWT は、チェックできないオーディエンスを無視しません。受信者を指定しているトークンは、自分がどの受信者なのかを指定しない限り拒否されます。`aud` の型が不正な場合(文字列でも文字列のリストでもない場合)にも、同じメッセージが表示されます。
発生する理由
検証者が audience を渡していない
よくある`aud` のないトークン向けに書かれたコード(または最小限の例からコピーしたコード)は、ID プロバイダーが `aud` を含め始めた途端に動作しなくなります。ほとんどのプロバイダーは、アクセストークンと ID トークンにこのクレームを含めています。想定されている修正は、期待するオーディエンスを渡すことです。
アクセストークンではなく ID トークンが使われている
ときどきプロバイダーの中には、`aud` のないアクセストークンを発行する一方で、ID トークンの `aud` には必ずクライアント ID を入れるものがあります(よくある例は Amazon Cognito です)。アクセストークンでは動作するコードも、クライアントが ID トークンを送った途端に失敗し始めます。
aud クレームの型が不正
まれ`aud` を数値、オブジェクト、または文字列以外を含むリストとして書き込む発行者は、PyJWT が何とも照合できないトークンを生成します。
修正方法
- 1.
自分がどのオーディエンスなのかを PyJWT に伝える
自分の API の識別子(または受け入れ可能な識別子のリスト)を渡してください。`verify_aud` を無効にしてはいけません。このチェックがあるからこそ、ほかのサービス向けのトークンが受け入れられずに済みます。
python claims = jwt.decode( token, signing_key, algorithms=["ES256"], audience="https://api.example.com", # the identifier your API is registered with ) - 2.
検証なしのデコードは中身の確認にだけ使う
`verify_signature: False` は、オーディエンスを含むすべてのチェックを無効にします。デバッグ中に `aud` を読むには便利ですが、リクエストの認可に使ってはいけません。
python # Reading claims without trusting them (debugging, routing) - never for authorization. header = jwt.get_unverified_header(token) claims = jwt.decode(token, options={"verify_signature": False})