本文へスキップ
ecdsa.com
jose (JavaScript)JWKS と鍵のディスカバリ

エラーメッセージ

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 が鍵セットを返していないということです。

発生する理由

修正方法

  1. 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. 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

関連するエラー

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