401 未经授权的 Django Rest API 登录

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

我的登录 API 端点有问题,上次我检查时它正在工作,现在盲目工作几个小时后它不再工作了,我不知道我做了什么:)

注册工作顺利,用户也在数据库中创建并在管理面板中可见。 相同的凭据不适用于登录。 我已经发布了下面的代码,提前感谢您的帮助

views.py

#register new users
@api_view(['POST'])
def register_user(request):
    if request.method == 'POST':
        serializer = UserSerializer(data= request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data,status=status.HTTP_201_CREATED)
        return Response(serializer.data,status=status.HTTP_400_BAD_REQUEST)

#userlogin with authentication tokens
@api_view(['POST'])
def user_login(request):
    if request.method == 'POST':
        email = request.data.get('email')
        password = request.data.get('password')
        user = None
        if not user:
            user = authenticate(email = email, password=password)
        
        if user:
            #token creation for the logged in user
            token, _ = Token.objects.get_or_create(user=user)
            return Response(user.getDetails(), status=status.HTTP_200_OK) # type: ignore
        return Response({'error': 'Invalid credentials'}, status=status.HTTP_401_UNAUTHORIZED)

模型.py

class CustomUser(AbstractUser):
   # username = models.CharField(max_length = 25 ,default = 'No name',unique = True)
    username = None
    email  = models.EmailField(default ="no email",unique = True)
    first_name = models.CharField(max_length = 25 ,default = 'No name')
    last_name = models.CharField(max_length = 25, default = 'No surname')
    password = models.CharField(max_length = 25,default = "no password")
    
    
    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = []
    
    def getDetails(self):
        return {
            'email': self.email,
            'first_name': self.first_name,
            'last_name': self.last_name
        }

序列化器.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomUser
        fields = ['id','email','password','first_name','last_name']
        extra_kwargs = {'password': {'write_only': True}}

尝试使用与注册过程相同的凭据登录用户

python django api django-rest-framework
1个回答
0
投票

请为登录过程创建一个序列化程序,如下所示:

class LoginSerializer(serializer.Serializer):
    password = serializers.CharField()
    email = serializers.EmailField()

当然你需要一个像这样的 CustomUserSerialzier :

class CustomUserSerializer(serializers.ModelSerializer):
    """
    Serializer class to serialize CustomUser model.
    """

    class Meta:
        model = User
        fields = ("email", "first_name", "last_name", "id",)

并在你的views.py中更改登录过程,如下所示:

class UserLoginAPIView(generics.GenericAPIView):
    """
    An endpoint to authenticate existing users using their email and password.
    """

    permission_classes = (permissions.AllowAny,)
    serializer_class = LoginUserSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data
        serializer = CustomUserSerializer(user)
        token = tokens.RefreshToken.for_user(user)
        data = serializer.data
        data["tokens"] = {"refresh": str(token), "access": str(token.access_token)}
        return response.Response(data, status=status.HTTP_200_OK)

希望有帮助。

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