我有一个关于使用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,因为我在这里看到了很多负面意见。
首先,感谢您发布此问题。我有一个类似的要求,即不使用本地存储,而且您的工作方向正确。
查看Knox的LoginView实现(在此处),似乎有相当数量的逻辑未在您的版本中复制(例如,令牌计数限制)。
LoginView
我采用了扩展Knox的方法LoginView。我调用默认post方法来使用Knox的实现,然后删除我不想在客户端上的JS上获取的信息。
post
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