基于子域具有不同 django 秘密的多个 JWT 生成

问题描述 投票:0回答:1

我正在使用简单的 JWT (django-rest-framework-simplejwt)。 我有一个验证用户身份的验证服务器。每个用户可以属于一个或多个租户,每个租户由一个子域表示。 我正在尝试为每个租户生成 django 秘密,当租户 docker 启动时,它使用身份验证服务器生成的 django 秘密(我将其存储在租户一的 .tenant1.local.env 中)

因此,当用户尝试连接到域时,系统将使用为该租户生成的密钥创建身份验证令牌。由于该租户将有权访问 .tenant.local.env (与用于为该租户生成令牌的密钥相同) 它将能够使用密钥对用户进行身份验证。

问题是我找不到一种简单的方法来继承或覆盖 django-rest-framework-simplejwt 中的类,以便我可以指定用于创建令牌的秘密。

包中有APISettings(您指定要使用哪些秘密),但没有如何使用它的示例。

有没有办法指定每个访问令牌生成请求使用哪些秘密,而不是为每个请求初始化整个 API。

django jwt multi-tenant
1个回答
0
投票

用于自己的生成或来自.get_token_backend()

检查
后端的任何代币。

TockenBackend
- 是您的 settings 的容器,它也包含您的“api_settings.SIGNING_KEY”。

在您的情况下,您可以覆盖令牌中的 .get_token_backend() 。

class MyTocken(AccessToken):
    ...
    self get_token_backend(self):
        signing_key = environ("get_security_key_accordingly_tennant")
        tb = super().get_token_backend(self)
        return type(tb)(algorithm=tb.algorithm, signing_key=signing_key,... other init data)

我为每个令牌创建一个新的

TockenBackend
实例,因为我不知道你的安全流程。但是,您可能只能在每个租户的服务器启动时执行一次。

from rest_framework_simplejwt.state import token_backend
token_backend.signing_key = environ("get_security_key_accordingly_tennant")

class MyTocken(AccessToken):
   _token_backend = token_backend

不要忘记覆盖

settings.SIMPLE_JWT
中的令牌类:

SIMPLE_JWT = {
    ...
    "AUTH_TOKEN_CLASSES": ("myproject.myapp.MyToken",),
    ...
}

更多信息在这里:https://django-rest-framework-simplejwt.readthedocs.io/en/latest/settings.html#auth-token-classes

这里: https://github.com/jazzband/djangorestframework-simplejwt/blob/master/rest_framework_simplejwt/tokens.py#L222

附注请耐心等待 - 如果我不明白你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.