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

エラーメッセージ

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` がまったくないことを意味します。

発生する理由

修正方法

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

関連するエラー

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