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

Is there a way to have tenant specific JWT token

我目前正在开发一个 SPA 应用程序 (angular),后端有 Python/Flask API。

该应用程序将支持多个租户,我对安全性概念有些疑惑。我目前正在使用 jwt-extended

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

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

默认情况下,密钥是应用级别的(使用 app.config('JWT_SECRET_KEY'),但看起来您可以覆盖 [=27= 中的密钥 encode/decode 函数]. 然而,我不确定我的@jwt_required 必须重写哪些函数才能正常工作(因此在解码中使用自定义密钥,该密钥将作为我的密钥 + 租户的串联生成)

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

你只是把我想要的租户放在用户 table 中以指定每个租户的用户,然后你需要将所有详细信息放在 jwt 中,然后在 angular 端你可以获得用户详细信息以及来自 jwt 令牌的租户详细信息,用于访问每个用户的特定租户以保护端点。

最终很容易生成特定于租户的 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]

然后 "register" 它与 jwt:

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