2

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

该应用程序将支持多个租户,我在安全概念上有点挣扎。我目前正在使用 jwt-extended

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

我的想法是为每个租户设置不同的 JWT_SECRET_KEY(例如将租户附加到我的密钥),然后检查每个租户的令牌的有效性(租户将由 url 标识,作为子域或参数)

默认情况下,密钥在应用程序级别(使用 app.config('JWT_SECRET_KEY') 但看起来您可以覆盖flask_jwt_extended.JWTManager 中的密钥编码/解码函数。但是我不确定我必须覆盖哪些函数让我的@jwt_required 工作我想要的(因此在解码中使用自定义密钥,该密钥将作为我的密钥+租户的连接生成)

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

4

2 回答 2

1

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

你只需要定义一个 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)
于 2019-09-26T14:07:12.667 回答
0

他你只是把我要在用户表中为每个租户指定用户的租户然后你需要将所有详细信息放在 jwt 中,然后在角度方面你可以从 jwt 令牌中获取用户详细信息以及租户详细信息以访问特定租户每个用户以保护端点。

于 2019-09-13T13:50:21.493 回答