PyJWT调用get_signing_key_from_jwt报PyJWKError的解决方法
问题根因
报错是因为你认证服务返回的JWK公钥条目缺失alg字段。PyJWT 2.4.0的PyJWKClient默认只会读取JWK条目自带的alg属性判断签名算法,不会主动从你传入的access_token的JWT头部提取alg值做匹配——就算返回的是合法的RS256 RSA公钥,只要条目里没写alg字段,就会直接抛出你看到的异常。
修复方案
任选一种方案即可解决问题:
- 客户端代码适配(无需修改服务端)
初始化PyJWKClient时显式传入实际使用的签名算法列表,当JWK条目缺失alg字段时,客户端会用传入的算法列表做匹配校验,不会直接抛错。修改后的代码如下:import jwt jwks_uri="https://my_auth_server/keys.json" jwks_client = jwt.PyJWKClient(jwks_uri, algorithms=["RS256"]) signing_key = jwks_client.get_signing_key_from_jwt(my_access_token) - 服务端配置修正(符合JWK标准规范)
如果你有权限修改认证服务的JWKs接口配置,直接给返回的每个公钥条目补充"alg": "RS256"字段即可。这种写法符合RFC 7517的JWK官方规范,能兼容所有版本的JWT解析客户端,不需要调整现有业务代码。
避坑提示
传入algorithms参数时不要使用过于宽泛的取值,不要启用none这类危险算法,也不要把业务未使用的算法加入列表,避免遭遇签名算法替换类的安全漏洞,仅填入实际使用的RS256即可。
内容的提问来源于stack exchange,提问作者Mercury
相关产品推荐
相关产品推荐

