エラーメッセージ
jwt issuer invalid. expected: https://login.example.com/
「expected:」の後のテキストは、設定した値そのものです。発行者を配列で指定した場合は、値がカンマで連結されます。
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify()
このエラーの意味
トークンの `iss` クレームが、`jwt.verify()` に渡した `issuer` オプションと一致しません(または、トークンに `iss` がまったくありません)。「expected:」の後のテキストは、トークンの値ではなく、設定した値です。jsonwebtoken は文字列を完全一致で比較します。つまり、署名は有効ですが、トークンはサービスが信頼していない発行元から来たと主張しています。
発生する理由
同じ発行者だが表記が異なる
よくある末尾のスラッシュ、http と https、ホスト名の大文字、パスセグメントの欠落(`/realms/main`、`/v2.0`、`/oauth2/default`)などです。ID プロバイダーは、ディスカバリドキュメントの `issuer` とまったく同じ値を `iss` に書き込みます。検証者も同じ文字列を使わなければなりません。
トークンに iss クレームがない
ときどき社内のトークンサービスは、`iss` を省略していることがよくあります。`issuer` オプションを設定している場合、照合する対象がないため、クレームが欠けていても同じメッセージで失敗します。
トークンが実際に別の発行者から来ている
ときどき別のテナント、環境、プロバイダーのトークンです。この場合のエラーは保護が機能している証拠です。拒否し続けてください。
修正方法
- 1.
トークンの iss を JSON として出力する
`JSON.stringify` を使うと、末尾のスラッシュ、空白文字、パスの違いといった目に見えない差異がわかるようになります。そのうえで、プロバイダーの `issuer` を `/.well-known/openid-configuration` から設定にコピーしてください。
js const { iss } = jwt.decode(token) ?? {}; console.log(JSON.stringify(iss)); // compare byte for byte with your issuer option - 2.
複数の発行者は意図した場合にのみ受け入れる
`issuer` オプションには配列を指定できます。これは、2 つの表記の間、または自分で管理する発行者の間での計画的な移行に使ってください。また、発行者ごとにそれぞれの鍵を対応させてください。
js jwt.verify(token, publicKey, { algorithms: ["ES256"], issuer: ["https://login.example.com/", "https://login.example.com"], // during a migration only });