Django с DRF. Пользователи не могут войти в систему со своими учетными данными

У меня есть веб-приложение, использующее Django в качестве бэкенда и React в качестве фронтенда. У меня есть форма регистрации, где пользователи вводят свои учетные данные, и профиль создается в базе данных. Однако, когда пользователи создают свой профиль, они не могут войти в систему, хотя данные пользователя доступны в базе данных. Изменение пароля пользователя с помощью панели django-admin устраняет эту проблему, и пользователи могут успешно войти в свои учетные записи. Я предполагаю, что это проблема с сохранением пароля при создании профиля, но я могу найти эту проблему.

Метод создания профиля

# Create user
@api_view(['POST'])
def sign_up(req):
    serializer = UserSerializer(data=req.data)

    if serializer.is_valid():
        if User.objects.filter(email=serializer.validated_data['email']).exists():
            return Response({'email': 'The email entered is already in use by another account.'})

        serializer.save()
        return Response({'status': 'success'})

    else:
        return Response(serializer.errors)

Метод входа пользователя

# Sign in user
@api_view(['POST'])
def sign_in(req):
    username = req.data['username']
    password = req.data['password']

    user = authenticate(req, username=username, password=password)

    if user is not None:
        return Response({'status': 'success'})

    else:
        return Response({'err': 'The username or password entered is incorrect.\nThe username and password are case sensitive.'})

Я пробовал принудительно сохранить пароль при создании профиля, но это не помогло. Я также пробовал некоторые онлайн-решения, но безрезультатно.

Вам не нужно передавать req в authenticate метод

# Sign in user
@api_view(['POST'])
def sign_in(req):
    username = req.data['username']
    password = req.data['password']

    user = authenticate(username=username, password=password)

Проблема в том, что пароль передается в необработанном виде, по умолчанию django не хранит его и устанавливает пароль как недействительный. Вам нужно переопределить метод создания сериализатора и хэшировать пароль вручную:

from rest_framework.serializers import ModelSerializer
from django.contrib.auth import get_user_model
from django.contrib.auth.hashers import make_password

class UserSerializer(ModelSerializer):
    class Meta:
        model = get_user_model()
        fields = '__all__'

    def create(self, validated_data):
        instance = get_user_model()(
            username=validated_data['username'],
            password=make_password(validated_data['password']),
            email=validated_data['email'],
            is_staff=True,
            is_active=True
        )
        instance.save()
        
        return instance
Вернуться на верх