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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:15:00