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
. Таким образом, объект запроса внутри функции содержит данные пользователя, если пользователь аутентифицирован, в противном случае он анонимный.