有没有办法让租户特定的JWT令牌

人气:946 发布:2022-10-16 标签: python multi-tenant flask jwt flask-jwt-extended

问题描述

我目前正在开发一个后端具有Python/FlaskAPI的SPA应用程序(角度)。

这个应用程序将支持多个租户,我在安全概念上有点困难。我当前正在使用JWT-Extended

颁发的JWT令牌对所有租户都有效(我当然可以从令牌中获取用户,然后检查用户是否应该有权访问该租户),但我希望有特定于租户的JWT令牌(以便用户被@JWT_REQUIRED阻止)。

我的想法是让每个租户有不同的JWT_SECRET_KEY(类似于将租户附加到我的密钥),然后检查每个租户的令牌的有效性(租户将通过URL标识为子域或参数)

默认情况下,密钥是应用程序级别的(使用app.config(‘JWT_SECRET_KEY’)),但看起来您可以覆盖flaskjwt_tended.JWTManager中的密钥编码/解码函数。然而,我不确定我必须为我的@JWT_Required重写哪些函数才能工作(因此在解码中使用保管密钥,该密钥将作为我的密钥+承租人的串联生成)

如果我的概念没有意义/如果有更好和/或更简单的方法来实现这一点,请让我知道。

推荐答案

最终生成租户特定的JWT非常容易(我将密钥与从下面的示例中提取的租户连接在一起)。

您只需要定义一个CustomDecodeKey/CustomEncode key方法:

def customEncodeKey(arg1):
    return app.config['JWT_SECRET_KEY'] + request.path.split('/')[1]

def customDecodeKey(arg1, arg2):
    return app.config['JWT_SECRET_KEY'] + request.path.split('/')[1]

然后向JWT注册:

jwt = JWTManager(app)
jwt.decode_key_loader(customDecodeKey)
jwt.encode_key_loader(customEncodeKey)

491