Генерация нескольких JWT с различными секретами django на основе субдоменов
Я использую простой JWT (django-rest-framework-simplejwt). У меня есть auth-сервер, который аутентифицирует пользователей. Каждый пользователь может принадлежать к одному или нескольким арендаторам, и каждый арендатор представлен поддоменом. Я пытаюсь сгенерировать django секрет для каждого арендатора и при запуске докера арендатора использовать django секрет, сгенерированный сервером аутентификации (я храню его в .tenant1.local.env для первого арендатора)
Так что когда пользователь пытается подключиться к домену, система создаст auth-токен, используя секрет, сгенерированный для этого арендатора. Поскольку этот арендатор будет иметь доступ к .tenant.local.env (тот же самый секрет, который был использован для генерации токена для этого арендатора) он сможет аутентифицировать пользователей, используя этот секрет.
Проблема в том, что я не могу найти простой способ наследовать или перезаписать класс в django-rest-framework-simplejwt, чтобы я мог указать секрет, который будет использоваться для создания токена.
В пакете есть APISettings (который указывает, какие секреты использовать), но нет примера, как его использовать.
Есть ли способ указать, какие секреты использовать в каждом запросе на генерацию токена доступа, вместо того чтобы инициализировать весь API для каждого запроса.
Любой токен, используемый для собственной генерации или проверки бэкенда из .get_token_backend()
.
TockenBackend
- это контейнер для ваших настроек, и он также содержит ваш "api_settings.SIGNING_KEY".
В вашем случае вы можете переопределить .get_token_backend() в tocken.
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
p.s. Пожалуйста, будьте терпеливы - если я не понял ваш вопрос.