エラーメッセージ
Expected 200 OK from the JSON Web Key Set HTTP response
jose (JavaScript) — JOSEError from createRemoteJWKSet, code ERR_JOSE_GENERIC
このエラーの意味
`createRemoteJWKSet` が鍵セットの URL にリクエストを送り、200 以外の HTTP ステータスを受け取りました。jose はリダイレクトを無効にして(`redirect: "manual"`)JWKS を取得するため、301/302 も 404 や 401 と同じく失敗として扱われます。鍵は 1 つも読み込まれておらず、トークンの署名も一切検証されていません。設定した URL が鍵セットを返していないということです。
発生する理由
設定した URL が jwks_uri ではない
よくあるパスはプロバイダーごとに異なります。Auth0 は `/.well-known/jwks.json`、Keycloak は `/realms/<realm>/protocol/openid-connect/certs`、Entra ID は `/<tenant>/discovery/v2.0/keys`、Google は `https://www.googleapis.com/oauth2/v3/certs` です。jose に発行者の URL やディスカバリドキュメントそのものを指定すると、404 か、JWKS ではないレスポンスが返ります。
エンドポイントがリダイレクトを返す
よくあるHTTP から HTTPS へのリダイレクト、末尾にスラッシュを付けるリダイレクト、ファイルを移動した CDN は、いずれも 30x を返します。ブラウザーや curl は何も表示せずにリダイレクトをたどりますが、jose はたどらないため、設定する URL はリダイレクト後の最終的な URL でなければなりません。
鍵セットが認証やネットワークポリシーで制限されている
ときどき社内の ID プロバイダーが、認証情報を要求する API ゲートウェイの背後に置かれていたり(401/403)、外向き通信用のプロキシが独自のエラーページを返したりすることがあります。JWKS は公開データであり、すべての検証者から認証情報なしで取得できるようにすべきです。
取得の回数が多すぎる
まれリクエストごとに新しいリモート JWKS オブジェクトを作成する検証者は、毎回鍵セットを取得し直すため、レート制限を受けることがあります(429)。キャッシュが機能するように、オブジェクトは一度だけ作成して再利用してください。
修正方法
- 1.
ディスカバリドキュメントから jwks_uri を読み取る
OpenID Connect のプロバイダーは、鍵セットの正確な URL を `/.well-known/openid-configuration` の `jwks_uri` として公開しています。起動時に一度だけこれを取得し、その URL を `createRemoteJWKSet` に渡してください。
js import { createRemoteJWKSet } from "jose"; // Resolve jwks_uri from the provider's discovery document instead of guessing it. const discovery = await fetch("https://login.example.com/.well-known/openid-configuration").then((r) => r.json()); const jwks = createRemoteJWKSet(new URL(discovery.jwks_uri)); - 2.
リダイレクトをたどらずにステータスコードを確認する
`-L` を付けない curl は jose と同じように動作します。必要なのは `{"keys":[...]}` を含む 200 です。30x が返れば、代わりに設定すべき URL がそこからわかります。
bash # Status line and redirect target, without following redirects (jose does not follow them either) curl -sS -o /dev/null -w '%{http_code} %{redirect_url}\n' https://login.example.com/jwks curl -s https://login.example.com/.well-known/openid-configuration | jq -r .jwks_uri