• en
  • Language: ru
  • Documentation version: 0.1

Авторизация имени пользователя

python-social-auth поставляется с бэкендом UsernameAuth, который пригодится, если на вашем сайте используется механизм аутентификации с помощью обычного старого имени пользователя и пароля.

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

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

Настройки бэкенда

SOCIAL_AUTH_USERNAME_FORM_URL = '/login-form/'

Используется для перенаправления пользователя на форму входа/регистрации, она должна иметь хотя бы одно поле с именем username. Форма должна отправляться по адресу /complete/username, или если она отправляется в ваше представление, то ваше представление должно завершить процесс, вызвав social_core.actions.do_complete.

SOCIAL_AUTH_USERNAME_FORM_HTML = 'login_form.html'

Шаблон будет использоваться для отображения формы входа/регистрации для пользователя, он должен иметь по крайней мере одно поле с именем username. Отправка формы должна происходить по адресу /complete/username, или если она переходит к вашему представлению, то ваше представление должно завершить процесс, вызвав social_core.actions.do_complete.

Работа с паролями

Вот пример обработки паролей, который можно добавить в конвейер:

def user_password(strategy, user, is_new=False, *args, **kwargs):
    if strategy.backend.name != 'username':
        return

    password = strategy.request_data()['password']
    if is_new:
        user.set_password(password)
        user.save()
    elif not user.validate_password(password):
        # return {'user': None, 'social': None}
        raise AuthException(strategy.backend)