Django REST Как правильно хешировать пароль

Я использую dj_rest_auth для аутентификации своих пользователей и возникает проблема с регистрацией. После того, как я создаю пользователя с помощью RegisterView, который дает dj_rest_auth, django создает пользователя без проблем, но хеширование пароля неверно, и поэтому я не могу войти в систему с новым созданным пользователем. Это мой вид регистрации:

registerview.py

class UserRegisterAPIView(RegisterView):
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        # user.set_password(make_password(request.data.get('password'))) Didn't work
        user = self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)

        return Response(self.get_response_data(user),
                        status=status.HTTP_201_CREATED,
                        headers=headers)

    def perform_create(self, serializer):
        user = serializer.save(self.request)
        create_token(self.token_model, user, serializer)
        complete_signup(self.request._request, user,
                        allauth_settings.EMAIL_VERIFICATION,
                        None)
        return user

РЕДАКТИРОВАТЬ: это один и тот же пароль, но хешированный по-разному (первый - это представление реестра dj_rest_auth, второй создается в панели администратора). Если я использую второй пароль для других пользователей, они успешно входят в систему.

dj_rest_auth

django создан


person altF4    schedule 06.11.2020    source источник
comment
Вы уверены, что полезная нагрузка запроса имеет пароль?   -  person JPG    schedule 06.11.2020
comment
Вы пытались позвонить set_password до или после создания пользователя? Также вам все еще нужно позвонить user.save() после set_password   -  person JoseKilo    schedule 06.11.2020
comment
@ArakkalAbu Я не могу распечатать его на консоли, потому что проверка электронной почты переопределяет то, что я пытаюсь распечатать (или что-то в этом роде, дело в том, что я не вижу, что я напечатал), однако в других представлениях я уже использовал request.data.get("something") для создания моделей, поэтому Я думаю, это работает.   -  person altF4    schedule 06.11.2020
comment
@JoseKilo сначала я вызываю set_password в perform_create после user=serializer.save, это не сработало, поэтому я попытался вызвать метод create, и это также не сработало, затем я спросил в stackoverflow   -  person altF4    schedule 06.11.2020
comment
Внутри perform_create вы звоните user = serializer.save(...), сразу после этого я звоню user.set_password(...), а затем user.save(). Это то, что вы пробовали в первую очередь?   -  person JoseKilo    schedule 06.11.2020
comment
Может быть, поле вашего пароля на самом деле password1? github.com/jazzband/dj- rest-auth/blob/master/dj_rest_auth/   -  person JoseKilo    schedule 06.11.2020
comment
@JoseKilo omg, наконец, я решил это благодаря вам, мое поле пароля не равно password, но когда я смотрел в сериализатор, я увидел, что у сериализатора есть метод save(), и я написал там set_password(...), и это, наконец, сработало. Если хочешь, напиши это как ответ, и тогда я приму его.   -  person altF4    schedule 06.11.2020
comment
Рад, что вы исправили :)   -  person JoseKilo    schedule 06.11.2020


Ответы (1)


Я думаю, что у вас есть опечатка в вашем методе create.

Где у вас есть раздел комментариев:

user.set_password(make_password(request.data.get('password')))

На самом деле должно быть:

user.set_password(make_password(serializer.data.get('password')))

Я не уверен, что там делает функция make_password, но это должно решить проблему.

person Miguel Marques    schedule 06.11.2020