如何在Python中使用JWK解码并验证JWT令牌
Python 基于JWK解码验证RS256算法JWT的实现方案
前置依赖安装
首先安装需要的第三方库:
pip install pyjwt cryptography
实现步骤与代码示例
你所持有的是RS256算法对应的RSA公钥JWK集合,完整解码验证逻辑如下:
import jwt from jwt import PyJWKSet # 你的JWK集合数据,生产环境也可以从OAuth服务的公开JWKS端点动态拉取 jwks_data = { "keys": [ { "kty": "RSA", "x5t#S256": "Some value", "e": "Some Value", "x5t": "Some Value", "kid": "SIGNING_KEY", "x5c": [ "Some Value" ], "key_ops": [ "verify", "encrypt" ], "alg": "RS256", "n": "Some Value" } ] } def decode_and_verify_jwt(token: str) -> dict: # 1. 解析JWT头部获取kid,匹配对应签名密钥 jwt_header = jwt.get_unverified_header(token) target_kid = jwt_header["kid"] # 2. 从JWKS中筛选对应kid的公钥 jwks = PyJWKSet.from_dict(jwks_data) signing_key = None for key in jwks.keys: if key.kid == target_kid: signing_key = key break if not signing_key: raise ValueError(f"未找到kid为{target_kid}的签名密钥") # 3. 解码并验证JWT合法性 try: payload = jwt.decode( token, key=signing_key.key, algorithms=["RS256"], # 可选校验项,根据你的OAuth服务实际配置填写 # issuer="OAuth服务签发地址", # audience="你的应用受众标识", ) return payload except jwt.exceptions.InvalidSignatureError: raise ValueError("JWT签名验证失败,令牌可能被篡改") except jwt.exceptions.ExpiredSignatureError: raise ValueError("JWT已过期") except Exception as e: raise ValueError(f"JWT验证失败:{str(e)}") # 调用示例 # your_token = "从客户端获取的访问令牌字符串" # payload = decode_and_verify_jwt(your_token) # print(payload)
关键说明
- 默认自动校验令牌的过期时间(
exp字段),如果业务场景不需要校验,可以在options参数中设置"verify_exp": False - 生产环境建议从OAuth服务的公开JWKS端点动态拉取密钥集合,避免硬编码密钥导致的更新不及时问题
- 除签名校验外,建议补充校验
iss(签发方)、aud(受众)字段,进一步提升安全性
内容的提问来源于stack exchange,提问作者Nikesh Kedlaya
相关产品推荐
相关产品推荐

