Issue in email login with customUser in Django rest framework

76 views Asked by At

hiiii i'm working on a school projet , and i basically have an issue with the login i cannot make it work no matter how many overrding im doing it always show me that my query doesnt match any existing user ({"status":401,"message":"Invalid Email or Password"})

custom user model :

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_("email address"), unique=True)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    is_company = models.BooleanField(blank=True,null=True)

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = []

    objects = CustomUserManager()

    def __str__(self):
        return self.email

custom email backend:

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try: 
            user = UserModel.objects.get(Q(email__iexact=username))
        except UserModel.DoesNotExist:
            UserModel().set_password(password)
        except MultipleObjectsReturned:
            return CustomUser.objects.filter(email=username).order_by('id').first()
        else:
            if user.check_password(password) and self.user_can_authenticate(user):
                return user

    def get_user(self, user_id):
        try:
            user = UserModel.objects.get(pk=user_id)
        except UserModel.DoesNotExist:
            return None

        return user if self.user_can_authenticate(user) else None

login view

class LoginAPIView(APIView):
    def post(self,request):
            serializer = LoginSerializer(data = request.data)
            if serializer.is_valid():
                    email = serializer.validated_data["email"]
                    password = serializer.validated_data["password"]
                    user = authenticate(request, username=email, password=password)
                    if user is not None:
                        token = Token.objects.get(user=user)
                        response = {
                               "status": status.HTTP_200_OK,
                               "message": "success",
                               "data": {
                                       "Token" : token.key
                                       }
                               }
                        return Response(response, status = status.HTTP_200_OK)
                    else :
                        response = {
                               "status": status.HTTP_401_UNAUTHORIZED,
                               "message": "Invalid Email or Password",
                               }
                        return Response(response, status = status.HTTP_401_UNAUTHORIZED)
            response = {
                 "status": status.HTTP_400_BAD_REQUEST,
                 "message": "bad request",
                 "data": serializer.errors
                 }
            return Response(response, status = status.HTTP_400_BAD_REQUEST)

login serializer :

class LoginSerializer(serializers.ModelSerializer):
    email = serializers.EmailField()
    class Meta:
            model = CustomUser
            fields = ['email','password']

I have to make an email/password login with token auth not an username one Pleaseee help me solve this i have been on it for 48 hours

1

There are 1 answers

0
Pycm On

Try below code,

Here it's not UserModel it is User.

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try: 
            user = User.objects.get(Q(email__iexact=username))
        except User.DoesNotExist:
            return None
        except MultipleObjectsReturned:
            return CustomUser.objects.filter(email=username).order_by('id').first()
        else:
            if user.check_password(password) and self.user_can_authenticate(user):
                return user

    def get_user(self, user_id):
        try:
            user = User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

        return user if self.user_can_authenticate(user) else None

and use the below code like above. You should return None.

        except User.DoesNotExist:
            return None