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

Bal*_*gan 12 python authentication encode oauth jwt

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

import jwt

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

print(jwt.decode(encoded_jwt, secret , algorithms=['RS256']))
Run Code Online (Sandbox Code Playgroud)

raise 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 返回后端.load_pem_private_key(data, password) 文件“/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”,第 1291 行,在 _handle_key_loading_error 中(“无法反序列化关键数据。”) 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,算法=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”,第 221 行,在 _verify_signature key = alg_obj.prepare_key(key) 文件“/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/站点包/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 行,在 1291 raise ValueError("无法反序列化关键数据。") ValueError: 无法反序列化关键数据。在 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:无法反序列化关键数据。在 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:无法反序列化关键数据。backend=default_backend()) 文件“/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/primitives/serialization.py”,第 24 行,在 load_pem_public_key 中 return backend.load_pem_public_key(数据)文件“/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", line 1291, in _handle_key_loading_error raise ValueError("无法反序列化关键数据。" ) ValueError: 无法反序列化关键数据。backend=default_backend()) 文件“/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/primitives/serialization.py”,第 24 行,在 load_pem_public_key 中 return backend.load_pem_public_key(数据)文件“/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", line 1291, in _handle_key_loading_error raise ValueError("无法反序列化关键数据。" ) ValueError: 无法反序列化关键数据。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- package/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:无法反序列化关键数据。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- package/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:无法反序列化关键数据。/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:可以不反序列化关键数据。/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", line 1291, in _handle_key_loading_error raise ValueError("Could not deserialize key data.") ValueError: could不反序列化关键数据。在 _handle_key_loading_error 中引发 ValueError("无法反序列化密钥数据。") ValueError: 无法反序列化密钥数据。在 _handle_key_loading_error 中引发 ValueError("无法反序列化密钥数据。") ValueError: 无法反序列化密钥数据。

进程以退出代码 1 结束

J4v*_*v4d 10

在 OpenSSL 中使用 RSA 密钥是个好主意:

openssl genrsa -out jwt-key 4096
openssl rsa -in jwt-key -pubout > jwt-key.pub
Run Code Online (Sandbox Code Playgroud)

参考:链接


小智 7

你是如何编码你的jwt的?使用以下方法之一

使用 RS256 (RSA) 编码和解码令牌

encoded = jwt.encode({'some': 'payload'}, private_key, algorithm='RS256')
decoded = jwt.decode(encoded, public_key, algorithms='RS256')
Run Code Online (Sandbox Code Playgroud)

在没有验证的情况下读取声明集

jwt.decode(encoded, verify=False)
{u'some': u'payload'}
Run Code Online (Sandbox Code Playgroud)

或者使用相同的秘密对 jwt 进行编码和解码,其中一种方法应该有效。在我的情况下,我使用jwt.decode(token, verify=False)是因为我的服务器已经为我做了签名验证,我只需要获取声明集。

  • 这对我不起作用,它在编码数据时显示“ValueError:无法反序列化关键数据。”。 (3认同)

Bal*_*gan 7

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)
Run Code Online (Sandbox Code Playgroud)


Tam*_*nyi 7

使用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
    #...
Run Code Online (Sandbox Code Playgroud)

专业提示:您可以在某个端点从您的身份验证服务器(在我的情况下为 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']
Run Code Online (Sandbox Code Playgroud)

  • “我从来没有成功地用 pyjwt 解码 keycloak 令牌”我在这里聚会迟到了,但是使用 pyjwt 验证来自 Keycloak 的 JWT 时遇到了类似的问题。我终于意识到这是因为 pyjwt 仅期望 PUBLIC-KEY 值(而不是完整的 PEM 证书)。我通过将 Keycloak 提供的 x509 证书转换为 PEM 文件(将其包装在“-----BEGIN/END CERTIFICATE-----”行中)并使用以下 openssl 命令来提取它来使其工作公钥值:`openssl x509 -pubkey -noout -incertificate.pem`。然后生成的公钥输出可与 pyjwt 一起使用。 (2认同)
  • FWIW:https://renzolucioni.com/verifying-jwts-with-jwks-and-pyjwt/ (2认同)

Mat*_*son 5

如果您收到此错误,请仔细检查您的公钥是否完全正确,新行很重要。

key = '''-----BEGIN PUBLIC KEY-----
<main key here>
-----END PUBLIC KEY-----'''
Run Code Online (Sandbox Code Playgroud)