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"]