You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用get_signing_key_from_jwt报错:无法找到匹配kid的签名密钥

解决PyJWKClientError: 找不到匹配的签名密钥问题

我在使用PyJWKClient获取JWT签名密钥时遇到如下错误:

PyJWKClientError: Unable to find a signing key that matches: "{kid}"

报错发生在这段获取签名密钥的代码中:

import jwt

jwks_uri="https://my_auth_server/oauth2/v1/keys"
jwks_client = jwt.PyJWKClient(jwks_uri)

signing_key = jwks_client.get_signing_key_from_jwt(token['access_token'])

我的令牌获取代码如下:

tdata = {
            'grant_type': 'authorization_code',
            'redirect_uri': config['redirect_uri'],
            'client_id': config['client_id'],
            'client_secret': config['client_secret'],
            'scope': 'openid',
            'state': state,
            'code': code,
        }
ret = requests.post(config["token_endpoint"], headers=theaders, data=urlencode(tdata).encode("utf-8"))

可能的原因及解决办法

  • 令牌的kid与JWKS中的密钥不匹配

    1. 先解析令牌的Header,查看其中的kid值:
      import jwt
      token_header = jwt.get_unverified_header(token['access_token'])
      print("令牌的kid:", token_header.get('kid'))
      
    2. 手动访问你的JWKS地址https://my_auth_server/oauth2/v1/keys,检查返回的密钥列表里是否存在这个kid。如果没有,说明认证服务器的密钥集已更新,或者你获取令牌时用的密钥和当前JWKS中的不一致。
  • JWKS客户端缓存问题
    PyJWKClient默认会缓存获取到的密钥,若之前获取过旧的密钥集,可能无法匹配新令牌的kid。可以禁用缓存或强制刷新密钥:

    # 禁用缓存初始化客户端
    jwks_client = jwt.PyJWKClient(jwks_uri, cache_keys=False)
    # 或者手动刷新密钥集后再获取签名密钥
    jwks_client.get_jwks()
    signing_key = jwks_client.get_signing_key_from_jwt(token['access_token'])
    
  • 令牌来源错误
    确认你的令牌确实是从https://my_auth_server获取的,检查token_endpoint配置是否正确,避免请求到错误的认证服务器导致令牌不匹配。

  • 令牌本身无效或被篡改
    若令牌的Header被篡改或令牌已失效,也会出现kid不匹配的情况。可以先跳过签名验证检查令牌有效性:

    try:
        payload = jwt.decode(token['access_token'], options={"verify_signature": False})
        print("令牌Payload:", payload)
    except jwt.InvalidTokenError as e:
        print("令牌无效:", e)
    

内容的提问来源于stack exchange,提问作者KristiLuna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 20:35:11