Dj allauth получает пароль при его сбросе

Мне нужно предоставить необработанный пароль пользователя allauth стороннему провайдеру, когда он сбрасывает свой пароль. Поэтому каждый раз, когда пароль сбрасывается, я вызываю @receiver(password_reset). Однако в этом случае пароль уже был соленым. Мне нужно получить необработанные данные пароля, чтобы реализовать смену пароля также на внешнем сервисе. Как получить новый "сырой" пароль, который еще не был соленым, или как я могу обессолить его?

@receiver(password_reset)
def password_change_callback(sender, request, user, **kwargs):
    #run third party api call containing the new password

Если вы хотите получить новый пароль, введенный пользователем при смене пароля. Вы можете сделать следующее: в post-запросе вы сохраните значение нового пароля, который пользователь ввел в форму, в переменной. Таким образом, после сброса пароля вы сможете получить доступ к исходному паролю, поскольку вы сохранили его в переменной перед сбросом. Таким образом, что-то вроде следующего:

new_password = request.POST.get("new_password")
# your code to set the new password goes here
and after that you can still access the new_password variable and do whatever you want with it.
class ChangeUserPasswordView(UpdateAPIView):

queryset = User.objects.filter(is_active=True)
permission_classes = (IsAuthenticated,)
serializer_class = ChangePasswordSerializer

def get_object(self, *args, **kwargs):
    return self.request.user

from django.contrib.auth.password_validation import validate_password

class ChangePasswordSerializer(serializers.ModelSerializer):
new_password = serializers.CharField(
    write_only=True, required=True, validators=[validate_password]
)
confirm_password = serializers.CharField(write_only=True, required=True)
old_password = serializers.CharField(write_only=True, required=True)

class Meta:
    model = User
    fields = ("old_password", "new_password", "confirm_password")

def validate_old_password(self, value):
    user = self.context["request"].user
    if not user.check_password(value):
        raise serializers.ValidationError(
            {"old_password": "Old password is not correct"}
        )

    return value

def validate(self, attrs):
    if attrs["new_password"] != attrs["confirm_password"]:
        raise serializers.ValidationError(
            {"password": "Password fields didn't match."}
        )

    return attrs

def update(self, instance, validated_data):
    instance.set_password(validated_data["new_password"])
    instance.save()

    return instance

В вашей пользовательской модели добавьте функцию

from django.contrib.auth.hashers import check_password

    def check_password(self, raw_password, *args, **kwargs):
    return check_password(raw_password, self.password)

Здесь в функции проверки сериализатора вы имеете доступ к введенному паролю пользователя, используя

attrs["new_password"]
Вернуться на верх