Django - пользователь не может войти в систему после восстановления пароля через rest api

Я создал пользовательскую модель пользователя, как описано в документации django https://docs.djangoproject.com/en/4.1/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project :

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    pass

Изменили AUTH_USER_MODEL в settings.py:

AUTH_USER_MODEL = 'users.CustomUser'

и создали сериализатор, используя django rest-framework:

from rest_framework import serializers
from users.models import CustomUser


    class CustomUserSerializer(serializers.ModelSerializer):
    
        def create(self, validated_data):
            user = super().create(validated_data)
            # user = CustomUser.objects.create_user(**validated_data)
            if validated_data.get('password'):
                password = validated_data.get('password')
                user.set_password('password')
                print("set password to ", password)
            user.save()
            return user
    
        def update(self, instance, validated_data):
            
            if validated_data.get('password'):
                password = validated_data.get('password')
                instance.set_password('password')
            
            instance.first_name = validated_data.get('first_name', instance.first_name)
            instance.last_name = validated_data.get('last_name', instance.last_name)
            instance.email = validated_data.get('email', instance.email)
    
            instance.save()
            return instance
    
    
    
        class Meta:
            model = CustomUser 
            exclude = ['last_login', 'is_superuser', 'is_staff', 'is_active', 'date_joined', 'groups', 'user_permissions']
     

Создание нового пользователя и его обновление через rest работает нормально. Но я не могу войти в систему с этим пользователем и заданным паролем. Я пробовал через api аутентификацию, предоставляемую фреймворком rest

path('api-auth/', include('rest_framework.urls')),

а также попытался войти в бэкенд администратора после присвоения пользователю статуса сотрудника.

Строка пароля, отображаемая в интерфейсе администратора для этого пользователя, кажется нормальной:

алгоритм: pbkdf2_sha256 итераций: 390000 соль: 2DrB5n**************** хэш: eflTzs**************************************

Похоже, что вызов set_password на экземпляре в методах сериализатора работает. Однако, вход с этим паролем невозможен. Но когда я обновляю пароль пользователя в панели администратора с помощью стандартной формы обновления пароля django, вход работает отлично.

Когда я сравниваю хэш пароля, созданный set_password и формой обновления пароля django, они выглядят одинаково. (соль и хэш, конечно, не одно и то же)

Что может вызвать проблему?

Ок, я вижу в ваших функциях update и create, что несмотря на получение пароля из проверенных данных, вы устанавливаете пароль для каждого пользователя как литеральную строку "password", поэтому пароль каждого пользователя будет "password", и это может быть проблемой, если только это не сделано намеренно.

def update(self, instance, validated_data):
    if validated_data.get('password'):
        password = validated_data.get('password')
        instance.set_password('password')
        # So instead of the above you should do:
        instance.set_password(password)
        # Same with the create method
            
        instance.first_name = validated_data.get('first_name', instance.first_name)
        instance.last_name = validated_data.get('last_name', instance.last_name)
        instance.email = validated_data.get('email', instance.email)
    
        instance.save()
        return instance
Вернуться на верх