首页 > 编程问答 >无法反序列化解码 JWT python 时的关键数据

无法反序列化解码 JWT python 时的关键数据

时间:2024-08-06 15:18:28浏览次数:18  
标签:python authentication oauth jwt encode

我正在使用 pyjwt 库来解码 JWT 令牌。我在解码时遇到此错误。代码在文档中给出。

import jwt

encoded_jwt='''eyJ0eXAiOiJKV1QiLCJhbG......'''
secret=b''''-----BEGIN PUBLIC KEY-----
MIIFRjCCBC6gAwIBAgIQCIdSGhpikQCjOIY154XoqzANBgkqhkiG9w0BAQsFADBN
......
-----END PUBLIC KEY-----'''

print(jwt.decode(encoded_jwt, secret , algorithms=['RS256']))

raise ValueError("Could not deserialize key data.") ValueError: Could 不反序列化关键数据。

您能帮我解决它吗,因为当我在 JWT 它正在工作的网站中使用它时。

这是完整的错误日志..

Traceback (最近一次调用最后一次):文件 “/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/algorithms.py”, 第205行,在prepare_key中 key = load_pem_private_key(key, 密码=None, backend=default_backend()) 文件 “/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/primitives/serialization.py”, 第 20 行,在 load_pem_private_key 中 返回 backend.load_pem_private_key(数据,密码) 文件“/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py”, 第 1014 行,在 load_pem_private_key 中 密码,文件“/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py”, 第 1233 行,在 _load_key 中 self._handle_key_loading_error() 文件“/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py”, _handle_key_loading_error 中的第 1291 行 raise ValueError("无法反序列化关键数据。") ValueError: 无法反序列化关键数据。

在处理上述异常期间,发生了另一个异常:

Traceback (最近一次调用最后): File “/home/sathiyakugan/PycharmProjects/JWTsample/sample.py”,第 45 行,位于 打印(jwt.decode(encoded_jwt,秘密,算法= ['RS256']))文件 “/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/api_jwt.py”, 第 93 行,在解码中 jwt、key=key、algorithms=algorithms、options=options、**kwargs 文件 “/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/api_jws.py”, 第 157 行,解码中 密钥,算法)文件“/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/api_jws.py”, _verify_signature 中的第 221 行 key = alg_obj.prepare_key(key) 文件“/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/algorithms.py”, 第207行,在prepare_key中 key = load_pem_public_key(key, backend=default_backend()) 文件“/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/primitives/serialization.py”, 第 24 行,在 load_pem_public_key 中 返回 backend.load_pem_public_key(data) 文件“/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py”, 第 1040 行,在 load_pem_public_key 中 self._handle_key_loading_error() 文件“/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py”, _handle_key_loading_error 中的第 1291 行 raise ValueError("无法反序列化关键数据。") ValueError: 无法反序列化关键数据。

进程已完成,退出代码为 1


该错误“ValueError: Could not deserialize key data” 表示 Python 的 cryptography 模块无法解析你提供的公钥。这通常是由于以下原因之一造成的:

  1. 密钥格式错误: 确保你使用的是有效的 PEM 格式的公钥。PEM 密钥应该以 -----BEGIN PUBLIC KEY----- 开头,以 -----END PUBLIC KEY----- 结尾。

  2. 密钥中存在额外的字符: 确保你的密钥字符串中没有额外的空格、换行符或其他不可见字符。你可以使用类似如下的代码来清除多余的字符:

python secret = b"-----BEGIN PUBLIC KEY-----\n" + \ b"MIIFRjCCBC6gAwIBAgIQCIdSGhpikQCjOIY154XoqzANBgkqhkiG9w0BAQsFADBN\n" + \ b"...\n" + \ b"-----END PUBLIC KEY-----"

  1. 编码问题: 确保你的公钥以字节字符串 ( b'...' ) 的形式存储,如上面的示例所示。

以下是使用 pyjwt 解码 JWT 令牌的完整示例:

import jwt

# 确保你的公钥格式正确,并且没有额外的字符
public_key = b"""-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApSSldZ/vJTKNMHVH8g/
...
qwIDAQAB
-----END PUBLIC KEY-----"""

encoded_jwt = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..."

try:
    # 使用公钥解码 JWT
    decoded_jwt = jwt.decode(encoded_jwt, public_key, algorithms=["RS256"])
    print(decoded_jwt)

except jwt.exceptions.InvalidSignatureError:
    print("签名无效")

except jwt.exceptions.DecodeError:
    print("无法解码 JWT")

except ValueError as e:
    print(f"密钥错误: {e}")

请注意: 你应该使用 公钥 解码 JWT,而不是私钥。私钥用于签名 JWT,公钥用于验证签名。

如果问题仍然存在,请提供你的完整公钥字符串和 JWT 令牌,以便我可以帮助你进一步调试问题。

标签:python,authentication,oauth,jwt,encode
From: 53337833

相关文章

  • Python科研武器库 - 字符串操作 - 字符串开头结尾判断 startswith() endswith()
    使用场景:按照开头的前缀、结尾的后缀来判断、筛选目标字符串。使用函数:str.startswith(search_string,start,end)str.endswith(search_string,start,end)search_string:要匹配的目标字符串。start:要从中匹配search_string的str的起始索引。end:要考虑匹配的str的结......
  • 我正在 python 中使用 aspose.pdf 将 pdf 转换为 excel 。但问题是它只能将 pdf 的前
    `从tkinter导入*将aspose.pdf导入为ap从tkinter导入文件对话框importpandasaspdinput_pdf=filedialog.askopenfilename(filetypes=(("PDF文件",".pdf"),("所有文件",".")))output_file=filedialog.asksaveasfil......
  • 如何在selenium python中访问电子邮件中的所有文件夹
    我使用imaplib库,但有时无法访问某些帐户,我使用poplib但它只支持访问主邮箱,但不支持访问其他文件夹,如垃圾邮件我想使用imaplib,但不会出现有时甚至无法访问的错误尽管我有一个帐户,但我仍然可以访问它,或者是否有另一个库可以快速支持该帐户?你想要使用Selenium和Python......
  • python安装torch-cluster、torch-scatter、torch-sparse和torch-geometric | torch_ge
    1.检查CUDA版本【方法1】用nvidia-smi已装cuda,用nvidia-smi或nvcc-V查看【方法2】用torch已装torch,用torch代码打印importtorchprint(torch.__version__)#查看pytorch安装的版本号print(torch.cuda.is_available())#查看cuda是否可......
  • Python:学生成绩管理系统(大学编程期末实验)
    引言在这个信息时代,教育管理的自动化已成为提高效率的关键。本文将介绍如何使用Python开发一个学生成绩管理系统,旨在简化成绩记录、查询和分析的过程。创作灵感来源本项目灵感来源于我在教育机构的工作经历,以及对提高教育管理效率的持续追求。通过复盘过往项目,我意识到一个......
  • 手把手教你使用Python网络爬虫下载一本小说(附源码)
    大家好,我是Python进阶者。前言前几天【磐奚鸟】大佬在群里分享了一个抓取小说的代码,感觉还是蛮不错的,这里分享给大家学习。一、小说下载如果你想下载该网站上的任意一本小说的话,直接点击链接进去,如下图所示。只要将URL中的这个数字拿到就可以了,比方说这里是951,那么这个数字......
  • 借助 Transformer 实现美股价格的预测(Python干货)
    作者:老余捞鱼原创不易,转载请标明出处及原作者。写在前面的话:      Transformer是一种在自然语言处理等领域广泛应用的深度学习架构,与传统的循环神经网络(RNN)相比,Transformer可以并行处理输入序列的各个位置,大大提高了计算效率。而且通过多层的深度堆叠,能够学习......
  • 将 Mojo 与 Python 结合使用
    Mojo允许您访问整个Python生态系统,但环境可能会因Python的安装方式而异。花些时间准确了解Python中的模块和包的工作原理是值得的,因为有一些复杂情况需要注意。如果您以前在调用Python代码时遇到困难,这将帮助您入门。Python中的模块和包让我们从Python开始,如......
  • Mojo和Python中的类型详解
    调用Python方法时,Mojo需要在原生Python对象和原生Mojo对象之间来回转换。大多数转换都是自动进行的,但也有一些情况Mojo尚未处理。在这些情况下,您可能需要进行显式转换,或调用额外的方法。Python中的Mojo类型Mojo基本类型隐式转换为Python对象。目前支持的......
  • python绘制圆柱体
     importosimportrandomimportnumpyasnpimportmatplotlib.pyplotasplt#合成管道数据集defplot_cylinder(center,radius,height,num_points=100):#生成圆柱体的侧面点坐标theta=np.linspace(0,2*np.pi,num_points)intervalZ=np.floor(h......