我正在使用pyjwt库来解码JWT令牌。解码时出现此错误。该代码在文档中给出。
import jwt
encoded_jwt='''eyJ0eXAiOiJKV1QiLCJhbG......'''
secret=b''''-----BEGIN PUBLIC KEY-----
MIIFRjCCBC6gAwIBAgIQCIdSGhpikQCjOIY154XoqzANBgkqhkiG9w0BAQsFADBN
......
-----END PUBLIC KEY-----'''
print(jwt.decode(encoded_jwt, secret , algorithms=['RS256']))
提高ValueError(“无法反序列化关键数据。”)ValueError:可以 不反序列化关键数据。
请问我在JWT网站上可以使用它时,请帮我解决它。
这是完整的错误日志。
回溯(最近通话最近):文件 “ /home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/algorithms.py”, 205行,在prepare_key中 key = load_pem_private_key(key,password = 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”, _load_key中的第1233行 self._handle_key_loading_error()文件“ /home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py”, 第1291行,_handle_key_loading_error中 引发ValueError(“无法反序列化关键数据。”)ValueError:无法反序列化关键数据。
在处理上述异常期间,发生了另一个异常:
回溯(最近通话最近):文件 “ /home/sathiyakugan/PycharmProjects/JWTsample/sample.py”,第45行,在 打印(jwt.decode(encoded_jwt,secret,algorithm = ['RS256']))文件 “ /home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/api_jwt.py”, 第93行,在解码中 jwt,key = key,算法=算法,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”, 第1291行,_handle_key_loading_error中 引发ValueError(“无法反序列化关键数据。”)ValueError:无法反序列化关键数据。
以退出代码1完成的过程
答案 0 :(得分:7)
将您的RSA密钥与OpenSSL结合使用是一个好主意:
openssl genrsa -out jwt-key 4096
openssl rsa -in jwt-key -pubout > jwt-key.pub
参考:link
答案 1 :(得分:2)
pyjwt库中存在一些问题。并且您必须从证书中获取公钥。
我使用了openssl x509 -pubkey -noout -in cert.pem > pubkey.pem
然后从公钥中,我可以使用authlib库轻松对其进行解码。
from authlib.specs.rfc7519 import jwt
encoded_jwt='''eyJ0eXAiOiJ....'''
secret=b'''-----BEGIN PUBLIC KEY-----
......
-----END PUBLIC KEY-----'''
claims = jwt.decode(encoded_jwt, secret)
print(claims)
答案 2 :(得分:1)
如果出现此错误,请仔细检查您的公钥是否正确,换行很重要。
key = '''-----BEGIN PUBLIC KEY-----
<main key here>
-----END PUBLIC KEY-----'''
答案 3 :(得分:1)
MacOS Catalina 10.15.4 Python 2.7.16。
这解决了我的问题
pip install cryptography==2.3
答案 4 :(得分:0)
您如何编码jwt?使用以下方法之一
使用RS256(RSA)进行编码和解码令牌
encoded = jwt.encode({'some': 'payload'}, private_key, algorithm='RS256')
decoded = jwt.decode(encoded, public_key, algorithms='RS256')
读取未经验证的声明集
jwt.decode(encoded, verify=False)
{u'some': u'payload'}
或者使用相同的秘密对jwt进行编码和解码,方法之一应该起作用。就我而言,我使用jwt.decode(token, verify=False)
是因为我的服务器已经为我完成了签名验证,所以我只需要获取声明集即可。
答案 5 :(得分:0)
使用authlib库,我从未尝试使用pyjwt
来解码密钥斗篷令牌。
您需要一个public_key
,我想您已经拥有它。
from authlib.jose import jwt
key = '-----BEGIN PUBLIC KEY-----\n' + public_key + '\n-----END PUBLIC KEY-----'
key_binary = key.encode('ascii')
try:
claims = jwt.decode(encoded,key_binary)
claims.validate()
#do some logic here
#...
ProTip:您可以从某个端点的身份验证服务器(在我的情况下为Keycloak)中轻松获取公钥:
url = 'http://localhost:8080/auth/realms/your_realm'
with urllib.request.urlopen(url) as r:
response = r.read()
public_key = json.loads(response)['public_key']
答案 6 :(得分:0)
对我来说,键(错误的IDE)中有空格会导致此问题,请确保情况并非如此