エラーメッセージ
Unable to find a signing key that matches: "2026-10"
別の表記
- jwt.exceptions.PyJWKClientError: Unable to find a signing key that matches: "2026-10"
- Unable to find a signing key that matches: "None"
引用符内の値はトークンの `kid` です。`"None"` は、ヘッダーに `kid` がないことを意味します。
PyJWT (Python) — jwt.exceptions.PyJWKClientError from PyJWKClient.get_signing_key_from_jwt
このエラーの意味
`PyJWKClient` は鍵セットを取得しましたが、トークンのヘッダーの `kid`(引用符内に表示)と等しい `kid` を持つ署名鍵が見つかりませんでした。PyJWKClient は `kid` が未知の場合に鍵セットを 1 回再取得するので、その鍵は現時点で本当にその URL で公開されていません。引用符内が `"None"` の場合は、トークンに `kid` がまったくないことを意味します。
発生する理由
署名鍵が公開前にローテーションされた
よくある発行者が新しい鍵を JWKS に追加する前にその鍵で署名すると(または CDN が古い JWKS のコピーを配信すると)、検証者はその鍵を見つけられません。発行者は新しい鍵を先に公開し、キャッシュの有効期限が切れてからその鍵に切り替えるべきです。
クライアントが別の発行者の鍵セットを参照している
よくあるテナント固有の JWKS URL(Cognito のユーザープール、Auth0 のテナント、Keycloak のレルム、Entra ID のテナント)はよく似ています。別の環境の URL からも本物の鍵が返されますが、このトークンの鍵ではありません。
トークンのヘッダーに kid がない
ときどき`PyJWKClient.get_signing_key_from_jwt` は `kid` で厳密に照合します。これを省略する発行者のトークンはこの方法では解決できないので、代わりに、公開されている唯一の鍵を明示的に指定して検証してください。
鍵は存在するが、使用可能な署名鍵ではない
ときどきPyJWKClient が対象にするのは、`use` がないか `"sig"` であり、かつ PyJWT が読み込める鍵だけです。サポートされていない種類の鍵はスキップされます。`kid` が生の JSON には現れるのに `get_signing_keys()` には含まれない場合は、これが原因です。
修正方法
- 1.
トークンの kid と読み込まれた鍵を比較する
`get_signing_keys(refresh=True)` を使うと、PyJWKClient が使える鍵を正確に確認できます。そこにトークンの `kid` がなければ、問題はコードではなく、発行者か URL にあります。
python print(jwt.get_unverified_header(token).get("kid")) for key in client.get_signing_keys(refresh=True): print(key.key_id, key.algorithm_name) - 2.
PyJWKClient を 1 つだけ作って再利用する
リクエストごとにクライアントを作成すると、キャッシュが無効になり、呼び出しのたびに発行者へアクセスすることになります。鍵のキャッシュを持つ長期間有効なクライアントでも、新しい `kid` が現れれば再取得します。
python from jwt import PyJWKClient # Module level: one client, cached keys, refetch on an unknown kid. JWKS = PyJWKClient("https://issuer.example.com/.well-known/jwks.json", cache_keys=True, lifespan=600) def verify(token: str) -> dict: signing_key = JWKS.get_signing_key_from_jwt(token) return jwt.decode(token, signing_key.key, algorithms=["ES256"], audience="https://api.example.com")