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

Posted

技术标签:

【中文标题】类型错误:load_pem_private_key() 缺少 1 个必需的位置参数:“后端”【英文标题】:TypeError: load_pem_private_key() missing 1 required positional argument: 'backend' 【发布时间】:2021-05-05 07:26:42 【问题描述】:

我正在尝试使用 adobe API2.0 提取 adobe 分析数据,我是这方面的新手,所以在此 repo 之后我确实提供了所有详细信息,例如 APIKEY、techaccountID、org_id、客户端密码、已修改配置.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

我用谷歌搜索,但找不到解决方案。从错误中,我可以解释我应该提供一个参数 backend 但我应该在哪里提供呢?有人可以帮我看看这里有什么问题吗?

【问题讨论】:

【参考方案1】:

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

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

有提交更新pyjwt[crypto] 以要求有效的加密包,但由于某种原因它没有显示在更改日志中,而且我通过手动将cryptography&gt;=3.3.1,&lt;4.0.0 添加到 requirements.txt 来解决问题

【讨论】:

***.com/questions/66208004/… 请问您能否回答这个问题?非常感谢您的帮助【参考方案2】:

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

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

问题是如果没有给出,pyjwt 不会设置默认后端。我已经厌倦了在我的 Mac 上使用 Python 3.9 的示例并且它有效。

但是 Python 3.9 不能在 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

【讨论】:

【参考方案3】:

尝试安装

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

然后重新启动 IDE/终端。

【讨论】:

【参考方案4】:

从 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

【讨论】:

【参考方案5】:

上面的错误曾经出现在我们尝试通过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=True) db = client.test

打印(分贝)

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

【讨论】:

以上是关于类型错误:load_pem_private_key() 缺少 1 个必需的位置参数:“后端”的主要内容,如果未能解决你的问题,请参考以下文章

失败/错误:需要'rspec/rails'类型错误:错误的参数类型类(预期模块)Rspec V3

js错误类型

js常见错误类型

错题本上的常见错误类型及改正方法

Flutter fromJson - 未处理的错误未处理的错误类型'String'不是'int'类型的子类型发生在实例中

我在尝试登录或注册时收到错误消息“错误类型‘AuthResult’不是类型转换中‘FirebaseUser’类型的子类型”