python - 值错误: Could not deserialize key data during jwt encoding

标签 python jwt python-cryptography

我正在尝试使用 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 的格式或兼容性问题。以下是解决此问题的方法:

  1. 安装加密技术: 首先,确保您安装了加密库:

    pip install cryptography
    
  2. 使用 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
  3. 更新您的代码: 生成这些 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/

相关文章:

python - 如何在python中调试导致后续异常的堆栈跟踪?

c# - DNN Jwt 授权请求无法从 C# 桌面应用程序运行

python - 密码学 - 生成新的 RSA 私钥

cryptography - 我可以在 AES-GCM 中发送未加密的随机数吗?

python - 在 Python 中使用 SHA256 对字节字符串进行签名

Python - 使用排序操作列和行 - reshape

python - 在 Pandas 数据框中将数据框与多索引连接起来

oauth-2.0 - 我们可以使用 ID Token 作为访问 token 吗?

python - 使用 SQLAlchemy 生成架构 SQL

javascript - JWT Restify 排除路径和所有子路径