- 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)