调用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中的密钥不匹配
- 先解析令牌的Header,查看其中的
kid值:import jwt token_header = jwt.get_unverified_header(token['access_token']) print("令牌的kid:", token_header.get('kid')) - 手动访问你的JWKS地址
https://my_auth_server/oauth2/v1/keys,检查返回的密钥列表里是否存在这个kid。如果没有,说明认证服务器的密钥集已更新,或者你获取令牌时用的密钥和当前JWKS中的不一致。
- 先解析令牌的Header,查看其中的
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
相关产品推荐
相关产品推荐

