TypeError: load_pem_private_key() missing 1 required positional argument: 'backend'

TypeError: load_pem_private_key() missing 1 required positional argument: 'backend'

我正在尝试使用 adobe API2.0 提取 adobe 分析数据,我是这方面的新手,所以在 repo 之后我确实提供了所有详细信息,例如 APIKEY、techaccountID、org_id,客户端密码,已修改 config.ini。生成 JWT 令牌时,出现以下错误。

TypeError: load_pem_private_key() missing 1 required positional argument: 'backend'

这是我的代码,

def get_jwt_token(config):
    with open(config["key_path"], 'r') as file:
        private_key = file.read()

    return jwt.encode({
        "exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=30),
        "iss": config["orgid"],
        "sub": config["technicalaccountid"],
        "https://{}/s/{}".format(config["imshost"], config["metascopes"]): True,
        "aud": "https://{}/c/{}".format(config["imshost"], config["apikey"])
    }, private_key, algorithm='RS256')


config = dict(config_parser["default"])
jwt_token = get_jwt_token(config)
logger.info("JWT Token: {}".format(jwt_token))
access_token = get_access_token(config, jwt_token)
logger.info("Access Token: {}".format(access_token))

这是错误信息,

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-17-8c61bcf6ee58> in <module>
      1 config = dict(config_parser["default"])
----> 2 jwt_token = get_jwt_token(config)
      3 logger.info("JWT Token: {}".format(jwt_token))
      4 access_token = get_access_token(config, jwt_token)
      5 logger.info("Access Token: {}".format(access_token))

<ipython-input-3-d22e1d6f4ebb> in get_jwt_token(config)
      9         "https://{}/s/{}".format(config["imshost"], config["metascopes"]): True,
     10         "aud": "https://{}/c/{}".format(config["imshost"], config["apikey"])
---> 11     }, private_key, algorithm='RS256')

~\AppData\Local\Continuum\anaconda3\lib\site-packages\jwt\api_jwt.py in encode(self, payload, key, algorithm, headers, json_encoder)
     61         ).encode("utf-8")
     62 
---> 63         return api_jws.encode(json_payload, key, algorithm, headers, json_encoder)
     64 
     65     def decode_complete(

~\AppData\Local\Continuum\anaconda3\lib\site-packages\jwt\api_jws.py in encode(self, payload, key, algorithm, headers, json_encoder)
    108         try:
    109             alg_obj = self._algorithms[algorithm]
--> 110             key = alg_obj.prepare_key(key)
    111             signature = alg_obj.sign(signing_input, key)
    112 

~\AppData\Local\Continuum\anaconda3\lib\site-packages\jwt\algorithms.py in prepare_key(self, key)
    248                         key = load_ssh_public_key(key)
    249                     else:
--> 250                         key = load_pem_private_key(key, password=None)
    251                 except ValueError:
    252                     key = load_pem_public_key(key)

TypeError: load_pem_private_key() missing 1 required positional argument: 'backend'

我尝试使用此视频中指定的不同方法,但上述方法也导致了同样的错误 https://www.youtube.com/watch?v=eSh2r3ZTCQU

我做了 Google,但找不到解决方案。从错误中,我可以解释我应该提供一个参数 backend 但我应该在哪里提供它?有人可以帮我看看这里出了什么问题吗?

我在 jwt.decode 中遇到了同样的错误,但仅在 CI (linux) 中,并且它在我的 mac.

中有效

检查 python -m jwt.help 您的加密版本是什么。 pyjwt 2 需要密码学 >= 3 并且出于某种原因对我来说它是 CI 中的 2.9.2 这样就可以解释为什么它对我来说失败了。

有提交更新 pyjwt[crypto] 以需要有效的加密包,但由于某些原因它没有显示在变更日志中,我还通过手动将 cryptography>=3.3.1,<4.0.0 添加到 requirements.txt

我遇到了同样的错误,但我的 Raspberry Pi 项目。我厌倦了 python Cloud IoT Core 的示例。如果有人遇到同样的问题,我分享我的经验。

我尝试了pyjwt和cryptography的不同版本组合,但问题依旧。

问题在于,如果给出 none,pyjwt 不会设置默认后端。我已经用 Python 3.9 厌倦了 Mac 上的示例并且它起作用了。

但是 Python 3.9 不适用于 Raspberry Pi,因为缺少一些依赖项。所以我在 Raspberry Pi 上编译了 Python 3.8.12,错误消失了。

这里是编译指南Python。

https://raspberrytips.com/install-latest-python-raspberry-pi/

首先安装这些库,否则 pip 将无法工作,因为缺少 ssl 模块。

sudo apt install libssl-dev
sudo apt install libncurses5-dev
sudo apt install libsqlite3-dev
sudo apt install libreadline-dev
sudo apt install libtk8.6
sudo apt install libgdm-dev
sudo apt install libdb4o-cil-dev
sudo apt install libpcap-dev

我不知道是否所有都是必要的,但它有效。

pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available

尝试使用

安装
$ python3 -m pip install --upgrade pyjwt[crypto]
...
Note: you may need to restart the kernel to use updated packages.

然后重新启动IDE/terminal。

从版本 3.1 开始,cryptography 模块使 backend 参数可选。

对于旧版本,使用 backend=default_backend() 显式调用 load_pem_private_key(或 load_ssh_public_key,或 load_..._..._key),如下所示:

from cryptography.hazmat.primitives.serialization import load_pem_public_key
from cryptography.hazmat.backends import default_backend

pem_key = load_pem_private_key(key_data, backend=default_backend())
jwt.encode({...}, key = pem_key, algorithm = 'RS512')

https://cryptography.io/en/3.3.1/hazmat/backends/index.html#getting-a-backend

当我们尝试通过 python 使用 jupyter notebook 与 mongodb atlas 建立连接时,会出现上述错误,导入 pymongo 包并从 atlas 复制连接字符串,但是当我们执行我们曾经得到这个错误。

要解决此错误, 只需按照以下步骤操作: 1)导入SSL ssl_cert_reqs=ssl.CERT_NONE 2) 在连接字符串中,输入逗号并粘贴 tls=True,tlsAllowInvalidCertificates=True

第二步看起来像: 导入 pymongo client = pymongo.MongoClient("mongodb+srv://username:password@mycluster.ro9h4.mongodb.net/myFirstDatabase?retryWrites=true&w=majority",tls=True,tlsAllowInvalidCertificates=真的) 数据库 = client.test

打印(db)

您会看到上述错误已解决。