Генерация нескольких 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

и здесь: https://github.com/jazzband/djangorestframework-simplejwt/blob/master/rest_framework_simplejwt/tokens.py#L222

p.s. Пожалуйста, будьте терпеливы - если я не понял ваш вопрос.

Вернуться на верх