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