django-rest-knox с печеньем - PullRequest
       9

django-rest-knox с печеньем

0 голосов
/ 18 февраля 2019

У меня есть вопрос об аутентификации с использованием django-rest-knox.Я хочу использовать хранилище cookie, а не localStorage на стороне клиента.Итак, я собираюсь реализовать, как показано ниже


class LoginView(GenericAPIView):
    serializer_class = LoginSerializer
    permission_classes = (AllowAny,)

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data
        token = AuthToken.objects.create(user)
        response = Response({
            'user': UserSerializer(user, context=self.get_serializer_context()).data,
            'token': token
        })
        response.set_cookie('token',
                            token,
                            httponly=True)
        return response

Это правильный способ использовать django-rest-knox?или мне нужно использовать localStorage?Я не хочу использовать JWT, потому что я видел много отрицательных мнений здесь.

1 Ответ

0 голосов
/ 20 мая 2019

Во-первых, спасибо за размещение этого вопроса.У меня было похожее требование не использовать локальное хранилище, и ваша работа должна быть направлена ​​в правильном направлении.

Глядя на реализацию 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
...