Сериализатор Django

этот сериализатор

class RegisterSerializer(serializers.ModelSerializer):
  class Meta:
    model = User
    fields = ['id', 'username', 'email', 'password']
    extra_kwargs = {'password': {'write_only': True}}
  
  def create(self, validated_data):
    #user = super(RegisterSerializer, self).create(validated_data)
    user = User.objects.create_user(**validated_data)
    return user

и Loginserializer :

class LoginSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()

    def validate(self, data):
        username = data.get('username')
        password = data.get('password')

        if username and password:
            user = authenticate(username=username, password=password)
            if user and user.is_active:
                return user

        raise serializers.ValidationError("Invalid credentials!")

Я использовал этот код и он работал хорошо, но когда я изменил мой Register serialzer

class RegisterSerializer(serializers.ModelSerializer):
  class Meta:
    model = User
    fields = ['id', 'username', 'email', 'password']
    extra_kwargs = {'password': {'write_only': True}}
  
  def create(self, validated_data):
    user = super(RegisterSerializer, self).create(validated_data)
    return user

код работает не очень хорошо. Когда я хочу протестировать свою конечную точку в Postman, код создает пользователя очень хорошо, но для входа в конечную точку я всегда получаю этот ответ Invalid credentials

Я не знаю, что произошло, когда я изменил свой код, сначала он работал хорошо, но когда я добавил эту строку, он не работал "user = super(RegisterSerializer, self).create(validated_data)"

Ваша проблема заключается в том, что user = super(RegisterSerializer, self).create(validated_data) хранит пароль в базе данных в виде обычного текста, в то время как django ожидает, что он будет хэширован. Вы можете проверить это, запустив python manage.py shell и выполнив:

from django.contrib.auth import get_user_model
UserModel = get_user_model()
UserModel.objects.first().password

Это должно вернуть что-то вроде pbkdf2_sha256$.... Если он возвращает plaintextpassword, у вас две проблемы:

  1. хранение паролей в открытом виде - кошмар безопасности
  2. вход в систему через джанго не работает так, как ожидалось

Чтобы решить эту проблему, просто хэшируйте пароль вручную в сериализаторе:

class RegisterSerializer(serializers.ModelSerializer):
  class Meta:
    model = User
    fields = ['id', 'username', 'email', 'password']
    extra_kwargs = {'password': {'write_only': True}}
  
  def create(self, validated_data):
    user = super(RegisterSerializer, self).create(validated_data)
    user.set_password(user.password) # set_password hashes input.
    user.save()

    return user
Вернуться на верх