• en
  • Language: ru
  • Documentation version: 0.1

Авторизация по электронной почте

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

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

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

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

SOCIAL_AUTH_EMAIL_FORM_URL = '/login-form/'

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

SOCIAL_AUTH_EMAIL_FORM_HTML = 'login_form.html'

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

Проверка электронной почты

Проверьте конвейер Валидация электронной почты в pipeline docs.

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

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

def user_password(strategy, backend, user, is_new=False, *args, **kwargs):
    if backend.name != 'email':
        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 AuthForbidden(backend)