Во-первых, спасибо за размещение этого вопроса.У меня было похожее требование не использовать локальное хранилище, и ваша работа должна быть направлена в правильном направлении.
Глядя на реализацию LoginView
Knox ( здесь ), похоже, что естьизрядное количество логики, которая не тиражируется в вашей версии (например, ограничения количества токенов).
Я принял подход к расширению Knox's LoginView
.Я вызываю метод post
по умолчанию, чтобы использовать реализацию Knox, а затем удаляю информацию, которую я не хочу делать доступной для JS на клиенте.
from django.contrib.auth import login
from rest_framework import permissions
from rest_framework.authtoken.serializers import AuthTokenSerializer
from knox.views import LoginView as KnoxLoginView
class LoginView(KnoxLoginView):
permission_classes = (permissions.AllowAny,)
def post(self, request, format=None):
serializer = AuthTokenSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
login(request, user)
response = super(LoginView, self).post(request, format=None)
token = response.data['token']
del response.data['token']
response.set_cookie(
'auth_token',
token,
httponly=True,
samesite='strict'
)
return response