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

Python中jwt.decode报Could not deserialize key data错误,在线解码正常

问题原因与解决方案

核心问题

你犯的关键错误是:使用RS256算法解码JWT时,未提供验证签名所需的公钥。

RS256是基于RSA的非对称加密算法,签名时用私钥,解码验证时必须用对应的公钥。你的Python代码仅指定了算法,未传入公钥参数,导致PyJWT库尝试用错误的方式处理密钥,从而抛出Could not deserialize key data和PEM格式错误。

而jwt.io能正常解析,是因为它会自动读取JWT Header中的kid字段,从对应的JWKS(JSON Web Key Set)端点获取公钥完成验证,无需手动输入。

解决步骤

1. 获取合法的公钥

你可以通过两种方式获取公钥:

  • 从jwt.io的解析页面复制公钥:打开jwt.io粘贴你的JWT后,在右侧"Public Key"区域复制完整的PEM格式公钥(必须包含-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----首尾行)。
  • 从身份提供商的JWKS端点获取:MSAL对接的是Azure AD,你可以从Azure AD的开放ID配置页面找到jwks_uri,访问该地址获取包含公钥的JSON,从中提取对应kid的公钥并转换为PEM格式。

2. 修正PyJWT调用代码

将公钥作为key参数传入jwt.decode方法:

import jwt

# 替换为你获取到的完整PEM格式公钥
public_key = """-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
-----END PUBLIC KEY-----"""

# 解码JWT,建议同时指定audience和issuer增强安全性
decoded_jwt = jwt.decode(
    'eyJ0..............',
    key=public_key,
    algorithms=['RS256'],
    audience='你的应用注册ID',
    issuer='https://login.microsoftonline.com/你的租户ID/v2.0'
)

进阶:自动从JWKS获取公钥

如果不想手动维护公钥,可以使用PyJWT的PyJWKClient自动获取并匹配对应密钥:

import jwt
from jwt import PyJWKClient

# 替换为Azure AD对应的JWKS端点
jwks_url = "https://login.microsoftonline.com/common/discovery/v2.0/keys"
jwks_client = PyJWKClient(jwks_url)

# 从JWT中提取kid并获取对应的签名密钥
signing_key = jwks_client.get_signing_key_from_jwt('eyJ0..............')

decoded_jwt = jwt.decode(
    'eyJ0..............',
    key=signing_key.key,
    algorithms=['RS256'],
    audience='你的应用注册ID',
    issuer='你的租户issuer'
)

错误细节解释

你遇到的error:0480006C:PEM routines::no start line错误,本质是因为PyJWT在未收到明确公钥的情况下,错误地将JWT字符串当作密钥处理——而JWT并非PEM格式的密钥,自然无法被OpenSSL解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:07:58