我正在尝试使用 jwt 生成 token ,并传递有效负载、secret_key 和算法(“RS256”)。这是代码部分
secret_key = AppConfig.JWT_SECRET_KEY
public_key = AppConfig.JWT_PUBLIC_KEY
payload = {'UserInfo': user_one.to_dict()}
payload['UserInfo']['picture'] = 'https://someimage.url'
payload.__setitem__('exp', exp) if exp is not None else ''
token = jwt.encode(payload, secret_key, algorithm='RS256').decode(CHARSET)
我收到此错误
File "/root/.pyenv/versions/3.6.5/lib/python3.6/code.py", line 91, in runcode
exec(code, self.locals)
File "<console>", line 1, in <module>
File "/activo-api/tests/helpers/generate_token.py", line 30, in generate_token
token = jwt.encode(payload, secret_key, algorithm='RS256').decode(CHARSET)
File "/root/.local/share/virtualenvs/activo-api-lpKgDXk8/lib/python3.6/site-packages/jwt/api_jwt.py", line 65, in encode
json_payload, key, algorithm, headers, json_encoder
File "/root/.local/share/virtualenvs/activo-api-lpKgDXk8/lib/python3.6/site-packages/jwt/api_jws.py", line 113, in encode
key = alg_obj.prepare_key(key)
File "/root/.local/share/virtualenvs/activo-api-lpKgDXk8/lib/python3.6/site-packages/jwt/algorithms.py", line 207, in prepare_key
key = load_pem_public_key(key, backend=default_backend())
File "/root/.local/share/virtualenvs/activo-api-lpKgDXk8/lib/python3.6/site-packages/cryptography/hazmat/primitives/serialization/base.py", line 20, in load_pem_public_key
return backend.load_pem_public_key(data)
File "/root/.local/share/virtualenvs/activo-api-lpKgDXk8/lib/python3.6/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1071, in load_pem_public_key
self._handle_key_loading_error()
File "/root/.local/share/virtualenvs/activo-api-lpKgDXk8/lib/python3.6/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1329, in _handle_key_loading_error
raise ValueError("Could not deserialize key data.")
ValueError: Could not deserialize key data.
当我使用HS256算法
时,会生成一个 token ,但是当我使用RS256算法
时,我收到上述错误。我已经尝试了几乎所有在线提供的解决方案,但仍然遇到相同的错误。
我的 key 具有以下格式:
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA3Tz2mr7SZiAMfQyuvBjM9Oi
RK+Lh9x5eJPo5CAZ3/ANBE0sTK0ZsDGMak2m1g7
wnLe4nOb7/eEJbDPkk05ShhBrJGBKKxb8n104o/
...........
5A13wiLitEO7nco2WfyYkQzaxCw0AwzlkVHiIyC
DtkpjGHQzPF6vOe907y5NQLvVFGXUq/FIJZxB8d==
-----END RSA PRIVATE KEY-----
预期输出应该是一个 token
最佳答案
您似乎在 JWT 编码期间遇到了 ValueError: Could not deserialize key data
。此错误通常表示与 RS256 算法一起使用的 key 的格式或兼容性问题。以下是解决此问题的方法:
安装加密技术: 首先,确保您安装了加密库:
pip install cryptography
使用 OpenSSL 生成 RSA key : 您需要创建与您的编码过程兼容的新 RSA key :
openssl genrsa -out jwt-key 4096 openssl rsa -in jwt-key -pubout > jwt-key.pub
- 第一个命令生成 4096 位 RSA 私钥 (
jwt-key
)。 - 第二个命令从私钥中提取公钥并将其保存为
jwt-key.pub
。
- 第一个命令生成 4096 位 RSA 私钥 (
更新您的代码: 生成这些 key 后,更新您的代码以使用
jwt-key
作为secret_key
并使用jwt-key.pub
作为public_key
。确保根据 PyJWT 库的要求正确加载和格式化这些 key 。
此过程应该可以解决 RS256 算法的问题。使用 RS256 时,您使用私钥对 token 进行签名,并使用公钥对其进行验证。确保 key 的存储和使用安全。
引用:Link
关于python - 值错误: Could not deserialize key data during jwt encoding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56251161/