【问题标题】:django-rest-knox with cookies带有 cookie 的 django-rest-knox
【发布时间】:2019-07-12 04:14:41
【问题描述】:

我有一个关于使用 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,因为我在这里看到了很多负面意见。

【问题讨论】:

    标签: reactjs django-rest-framework


    【解决方案1】:

    首先,感谢您发布这个问题。我有类似的要求,不使用本地存储,你的工作被指出了正确的方向。

    查看 Knox 的 LoginView 实现 (here),您的版本中似乎没有复制大量逻辑(例如,令牌计数限制)。

    我采取了扩展 Knox 的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
    

    【讨论】:

      猜你喜欢
      • 2019-05-23
      • 1970-01-01
      • 2021-05-12
      • 2019-09-23
      • 1970-01-01
      • 2020-07-17
      • 2021-04-06
      • 2019-03-10
      • 2019-07-24
      相关资源
      最近更新 更多