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

时间:2018-11-16 12:21:53

标签: 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']))
  

提高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完成的过程

7 个答案:

答案 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)中有空格会导致此问题,请确保情况并非如此