我正在使用 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
模块无法解析你提供的公钥。这通常是由于以下原因之一造成的:
-
密钥格式错误: 确保你使用的是有效的 PEM 格式的公钥。PEM 密钥应该以
-----BEGIN PUBLIC KEY-----
开头,以-----END PUBLIC KEY-----
结尾。 -
密钥中存在额外的字符: 确保你的密钥字符串中没有额外的空格、换行符或其他不可见字符。你可以使用类似如下的代码来清除多余的字符:
python
secret = b"-----BEGIN PUBLIC KEY-----\n" + \
b"MIIFRjCCBC6gAwIBAgIQCIdSGhpikQCjOIY154XoqzANBgkqhkiG9w0BAQsFADBN\n" + \
b"...\n" + \
b"-----END PUBLIC KEY-----"
-
编码问题:
确保你的公钥以字节字符串 (
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