我正在使用简单的 JWT (django-rest-framework-simplejwt)。 我有一个验证用户身份的验证服务器。每个用户可以属于一个或多个租户,每个租户由一个子域表示。 我正在尝试为每个租户生成 django 秘密,当租户 docker 启动时,它使用身份验证服务器生成的 django 秘密(我将其存储在租户一的 .tenant1.local.env 中)
因此,当用户尝试连接到域时,系统将使用为该租户生成的密钥创建身份验证令牌。由于该租户将有权访问 .tenant.local.env (与用于为该租户生成令牌的密钥相同) 它将能够使用密钥对用户进行身份验证。
问题是我找不到一种简单的方法来继承或覆盖 django-rest-framework-simplejwt 中的类,以便我可以指定用于创建令牌的秘密。
包中有APISettings(您指定要使用哪些秘密),但没有如何使用它的示例。
有没有办法指定每个访问令牌生成请求使用哪些秘密,而不是为每个请求初始化整个 API。
用于自己的生成或来自.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
附注请耐心等待 - 如果我不明白你的问题。