类型错误: load_pem_private_key() 缺少 1 个必需的位置参数:'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')
~AppDataLocalContinuumanaconda3libsite-packagesjwtapi_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(
~AppDataLocalContinuumanaconda3libsite-packagesjwtapi_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 
~AppDataLocalContinuumanaconda3libsite-packagesjwtalgorithms.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

我搜索了一下,但是找不到答案。从错误中,我可以解释我应该提供一个参数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到需求。txt修复问题

从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

尝试使用

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

然后重新启动IDE/terminal.

我有同样的错误,但与我的树莓派项目。我为Google Cloud IoT Core编写了python示例。如果有人遇到同样的问题,我将分享我的经验。

我尝试了pyjwt和密码学的不同版本组合,但问题仍然存在。

问题是pyjwt不设置默认后端,如果没有给出。我用Python 3.9在我的Mac上运行了这个例子,它工作了。

但是Python 3.9不能在树莓派上工作,因为有一些缺失的依赖项。所以我在我的树莓派上编译了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配置了需要TLS/SSL的位置,但是Python中的SSL模块不可用

以前使用jupyter notebook通过python与mongodb atlas建立连接,导入pymongo包并从atlas中复制连接字符串时,会出现上述错误,但在执行时出现此错误。

要解决此错误,只要遵循以下步骤:1)进口sslssl_cert_reqs = ssl。CERT_NONE2)在连接字符串中,用逗号粘贴tls=True,tlsAllowInvalidCertificates=True

第二步如下:进口pymongoclient = pymongo.MongoClient("mongodb+srv://username:password@mycluster.ro9h4.mongodb.net/myFirstDatabase?retryWrites=true&w=majority",tls=True,tlsAllowInvalidCertificates=True)Db = client.test

打印(db)

你会看到上面的错误被解决了。

最新更新