django中的令牌认证,凭据正确,已保存在数据库中,但仍未生成令牌

izkcnapc  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(135)

嗨,我被一个问题卡住了,数据库中的凭据是正确的,但它仍然打印“否则”条件“无效的电子邮件或密码”。帮我一把--我被这个问题困住了。
我尝试在“www.example.com“文件中设置AUTHENTICATION_BACKENDsettings.py。但它不是这里的解决方案。

class LoginAPIView(views.APIView):
        def post(self, request):
            email = request.data["email"]
            password = request.data["password"]
    
            serializer = LoginSerializer(data=request.data)
            print(serializer)
    
            user = authenticate(email=email, password=password)
            
    
            if serializer.is_valid():
                if user is not None:
                    token, created = Token.objects.get_or_create(user=user)
                    return Response({
                        'data': serializer.data,
                        'token': token.key
                    })
                else:
                    return Response({
                        'errors': 'Invalid email or password.'
                    }, status=400)
            else:
                return Response(serializer.errors, status=400)

views.py 代码

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

用户串行化程序代码

class UserSerializer(serializers.ModelSerializer):
    def create(self, validated_data):
        user = User(
            email=validated_data['email'],
            age=validated_data['age'],
            first_name=validated_data['first_name'],
            last_name=validated_data['last_name'],
            country=validated_data['country'],
            hobby=validated_data['hobby'],
        )
        user.set_password(validated_data['password'])
        user.save()
        return user

    class Meta:
        model = User
        fields = '__all__'

我知道问题出在身份验证方法上,但我不知道如何解决这个问题。另外,我已经检查了www.example.com文件中的AUTHENTICATION_BACKENDS设置settings.py,它似乎配置正确。我将感谢任何关于如何解决这个问题的见解或建议。谢谢你!

4dc9hkyq

4dc9hkyq1#

我的猜测是,您正在使用django.contrib.auth import authenticate中的默认authenticate方法,该方法仅适用于usernamepassword
您可能需要编写一个自定义的authenticate函数并使用它。

def authenticate(email=None, password=None):
    try:

        user = User.objects.get(email=email)
        if user.check_password(password):
            return user
        else:
            return None
    except User.DoesNotExist:
        return None

相关问题