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