エラーメッセージ
jwt audience invalid. expected: <audience>
プレースホルダーには、設定した値が入ります。例:「jwt audience invalid. expected: api://orders」。
このエラーの意味
トークンは暗号学的には検証に成功しましたが、その aud クレームが、検証者の要求するオーディエンスと一致しません。オーディエンスのチェックは、ある API 向けに発行されたトークンを別の API に対してリプレイできないようにするためにあります。署名はトークンを誰が発行したかを証明し、aud はどのサービス向けに発行されたかを証明します。クレームを信頼するには、両方のチェックに合格しなければなりません。
発生する理由
識別子が完全一致していない
よくあるaud は文字列の完全一致で比較されます。https://api.example.com と、末尾にスラッシュが付いた https://api.example.com/ の違い、http と https の違い、クライアント ID と API 識別子の違いは、いずれも失敗の原因になります。OAuth プロバイダーは、特定のオーディエンスを要求しない限り、aud に client_id を入れることがよくあります。
トークンが別の API 向けに発行された
よくあるクライアントがサービス A 用のトークンを取得し、サービス B に送信しました。1 つの ID プロバイダーが複数の API を扱っている場合によく起こります。トークンリクエストでオーディエンスを指定するパラメーターには、トークンの提示先となる API を指定しなければなりません。
aud が配列で、想定が食い違っている
ときどきaud は仕様上、文字列の配列であってもかまいません。jsonwebtoken は、いずれかの要素が期待値のいずれかと等しければ一致とみなします。しかし、aud が単なる文字列だと想定して事前に手動で検証するコードは、配列値のクレームで動作しなくなります。
修正方法
- 1.
トークンに含まれる値と期待する値を比較する
両方の値を出力してください。そのうえで、間違っているほう(検証者のオーディエンスのオプション、またはクライアントがトークンを要求するときに使う audience/resource パラメーター)を修正してください。
js const { aud } = jwt.decode(token); console.log("token aud:", aud); // e.g. "api://orders" or ["api://orders"] jwt.verify(token, key, { algorithms: ["ES256"], audience: "api://orders", // must match exactly (string, array or RegExp) }); - 2.
正当なバリエーションを明示的に受け入れる
この API で複数の識別子が本当に有効なら、それらを列挙してください。エラーを消すためにオーディエンスのチェックを外してはいけません。
js jwt.verify(token, key, { algorithms: ["ES256"], audience: ["api://orders", "https://api.example.com"], });