Как добавить пользовательское утверждение в django rest_framework_simple_jwt?

В их официальной документации показана реализация только для представлений на основе классов.

Как сделать это для функции, т.е. Refreshtoken.for_user()?

from rest_framework_simplejwt.tokens import RefreshToken

def get_tokens_for_user(user):

    refresh = RefreshToken.for_user(user)
    
    return {
        'refresh': str(refresh),
        'access': str(refresh.access_token),
    }

Отрывок отсюда. Здесь только показано, как создать токен вручную.

Я знаю, что использование pyjwt упростило бы жизнь, но для черного списка будет другой обходной путь.

Самый простой способ, которому я всегда следовал, приведен здесь. Вы можете увидеть, что класс Token в rest_framework_simplejwt реализован __setitem__ и __getitem__. Поэтому вы легко можете добавить утверждение к своему токену.

Вам необходимо создать клиентский сериализатор, который будет расширять класс TokenObtainSerializer. Смотрите код для лучшего понимания:

serializers.py:

class MyTokenObtainPairSerializer(TokenObtainSerializer):
    token_class = RefreshToken

    def validate(self, attrs):
        data = super().validate(attrs)

        refresh = self.get_token(self.user)

        refresh["my_claim"] = "value" # here you can add custom cliam

        data["refresh"] = str(refresh)
        data["access"] = str(refresh.access_token)

        return data

Затем создайте представление, которое будет расширять класс TokenViewBase:

views.py

class MyTokenObtainPairView(TokenViewBase):
    serializer_class = MyTokenObtainPairSerializer

urls.py

urlpatterns = [
    path('api/token/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
]

Вот так, готово.

После выполнения этих шагов и расшифровки маркера доступа вы найдете что-то похожее на следующее:

{
  "token_type": "access",
  "exp": 1651785191,
  "iat": 1651784891,
  "jti": "8432cb561ef0467e909e4a4c05234b71",
  "user_id": 1,
  "my_claim": "value"
}

Для получения дополнительной информации вы можете посмотреть это repo. Здесь я сделал проект, следуя пакету rest_framework_simplejwt для изучения и понимания пользовательского бэкенда аутентификации.

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