类型错误:load_pem_private_key() 缺少 1 个必需的位置参数:“后端”

问题描述

我正在尝试使用 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"],10         "aud": "https://{}/c/{}".format(config["imshost"],config["apikey"])
---> 11     },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,json_encoder)
     64 
     65     def decode_complete(

~\AppData\Local\Continuum\anaconda3\lib\site-packages\jwt\api_jws.py in encode(self,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

我使用了谷歌,但找不到解决方案。从错误中,我可以解释我应该提供一个参数 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 来解决问题