Django request.user всегда возвращает AnonymousUser, несмотря на отправленный с запросом токен

У меня есть класс, который работает по-разному в зависимости от того, аутентифицирован пользователь или нет:

class SomeClass(APIView):
    authentication_classes = ()
    permission_classes = ()

    def get(self, request):
        if request.user.is_authenticated:
            # do something...
        else:
            # do something else...

раньше он прекрасно работал с django 3.2.5 и JSONWebTokenAuthentication. однако мне пришлось перейти на django 4.x и TokenAuthentication... с:

authentication_classes = (TokenAuthentication, )

пользователь доступен, но запрос возвращает 401 для анонимных пользователей... с:

authentication_classes = ()

анонимные запросы принимаются, но я не могу увидеть данные аутентифицированных пользователей.

Необходимо войти и сохранить пользователя в сессии

from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response
from django.contrib.auth import authenticate, login

class LoginView(APIView):
    # authentication_classes = ()
    permission_classes = ()
    def post(self, request):
        email = request.data.get("email")
        password = request.data.get("password")
        user = authenticate(email=email, password=password) # TODO Check if use can be authenticated
        
        if user:
            login(request, user) #TODO use login to store session of the logged in user
            return Response({
                "userId":user.id,
                "firstname": user.first_name,
                "lastname": user.last_name,
                "email": user.email,
                "token": user.auth_token.key,
                "other_fiels": "other"
            })
        else:
            return Response({"error": (email, password)}, status=status.HTTP_400_BAD_REQUEST)

ok. я наконец-то закончил расширять класс TokenAuthentication:

from rest_framework.authentication import TokenAuthentication

class MyTokenAuthentication(TokenAuthentication):

    def authenticate_credentials(self, key):
        model = self.get_model()
        try:
            token = model.objects.select_related('user').get(key=key)
        except model.DoesNotExist:
            # raise exceptions.AuthenticationFailed(_('Invalid token.'))
            return None

        if not token.user.is_active:
            # raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))
            return None
        return token.user, token

вместо того, чтобы вызвать исключение, я возвращаю None. Таким образом, объект запроса внутри функции содержит данные пользователя, если пользователь аутентифицирован, в противном случае он анонимный.

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