Как вернуть ответ 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.")