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)是因为我的服务器已经为我做了签名验证,我只需要获取声明集。
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)
使用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)
如果您收到此错误,请仔细检查您的公钥是否完全正确,新行很重要。
key = '''-----BEGIN PUBLIC KEY-----
<main key here>
-----END PUBLIC KEY-----'''
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31036 次 |
| 最近记录: |