Django 休息会话身份验证邮递员

问题描述 投票:0回答:1

我定制了django auth方法:

class MyBackend(ModelBackend):

    def authenticate(self, request, phone=None, otp=None, **kwargs):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(phone=phone)
        except UserModel.DoesNotExist:
            return None
        else:
            if user.otp == otp:
                # user.otp = None
                # user.save()
                return user

    def get_user(self, phone):
        UserModel = get_user_model()
        try:
            return UserModel.objects.get(phone=phone)
        except UserModel.DoesNotExist:
            return None

我的认证类:

class ValidateOTP(APIView):
    def post(self, request):
        phone = request.data.get('phone', None)
        otp = request.data.get('otp', None)

        if not phone or not otp:
            return Response({'error': 'Wrong data.'}, status=status.HTTP_400_BAD_REQUEST)

        user = authenticate(request, phone=phone, otp=otp)
        login(request, user)
        return Response({'Ok': 'ok'}, status=status.HTTP_200_OK)

使用邮递员,我通过端点创建用户http://127.0.0.1:8000/api/validate-otp/。一切都好。 但是当我尝试向另一个端点发送 GET 请求时,我的 request.user 是匿名的。

class UserInfo(APIView):
    permission_classes = ([IsAuthenticated])
    def get(self, request):
        print(request.user)
        return Response({'ok': 'ok'}, status=status.HTTP_200_OK)

可能出现什么问题?

django authentication django-rest-framework
1个回答
0
投票
API 中的

login(…)

 [Django-doc](通常)没有多大意义。除非您使用 SessionAuthentication
 
[drf-doc] 或自己实现一些类似会话的身份验证。登录信息附加到该会话,但下一个 HTTP 请求不会使用该会话:如果您使用基于会话的身份验证,则每次都需要随请求发送会话 ID。

像 OTP 这样的身份验证应该返回一个令牌,然后客户端可以将其用于(每个)请求,或者可能更改令牌,或者使用会话 ID,但用户登录因此会登录该用户的

会话 ,所以如果你使用它,你将需要 API 和客户端来了解会话。

© www.soinside.com 2019 - 2024. All rights reserved.