Как вернуть ответ 401 в SimpleJWT Custom Token при использовании Django Rest Framework?

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

Мой пользовательский класс токенов выглядит следующим образом:

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework import status
from rest_framework.response import Response

class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        if user.is_enabled:
            token = super().get_token(user)
            # Add custom claims
            token['name'] = user.name
            token['gender'] = user.gender

            return token
        else:
            return Response({'detail':'Account not enabled'}, status=status.HTTP_401_UNAUTHORIZED)

class CustomTokenObtainPairView(TokenObtainPairView):
    serializer_class = CustomTokenObtainPairSerializer

Корень URL выглядит следующим образом:

re_path(r'^authenticate/',CustomTokenObtainPairView.as_view(), name='authenticate'),

Вы можете вернуть из get_token какой-нибудь символ, например None в Python, если пользователь не включен, а затем переопределить метод get в CustomTokenObtainPairView, чтобы вернуть 401, если значение get_token равно None.

Вы можете сделать что-то подобное

from rest_framework import status, serializers
from rest_framework.response import Response
from rest_framework.views import APIView

from rest_framework_simplejwt.tokens import RefreshToken


class LoginUserSerializer(serializers.Serializer):
    email = serializers.EmailField()
    password = serializers.CharField(write_only=True, min_length=5)


class LoginUserApi(APIView):

    def post(self, request):
        serializer = LoginUserSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        user = authenticate(email=request.data['email'], password=request.data['password'])
        if not user:
            return Response({'detail':'Incorrect email or password'}, status=status.HTTP_400_BAD_REQUEST)
        elif not user.is_enabled:
            return Response({'detail':'Account not enabled'}, status=status.HTTP_401_UNAUTHORIZED)

        # Generate Token
        refresh = RefreshToken.for_user(user)
        data = {}
        data['name'], data['gender'] = user.name, user.gender
        data['refresh'], data['access'] = str(refresh), str(refresh.access_token)    

        return Response(data, status=status.HTTP_200_OK)

Ссылка из docs

Вот что работает для меня, это простое решение и дает мне нужный результат, поэтому я и размещаю это как ответ.

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework import status
from rest_framework.response import Response
from rest_framework_simplejwt.exceptions import InvalidToken

class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        if user.is_enabled:
            token = super().get_token(user)
            # Add custom claims
            token['name'] = user.name
            token['gender'] = user.gender
            return token
        else:
            raise InvalidToken("User is not enabled.")
Вернуться на верх