Как Быстро Настроить Аутентификацию Электронной Почты В Django

Всем привет! Аутентификация пользователей уже давно является распространенной задачей.

Django, как и любой современный веб-фреймворк, имеет отличный механизм аутентификации пользователей.

Однако этот механизм по умолчанию использует в качестве идентификатора логин, тогда как мы все уже привыкли использовать для входа электронную почту.

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

Я решил исправить эту несправедливость.



Как быстро настроить аутентификацию электронной почты в Django

Немного покопавшись в интернете мой выбор пал на модуль учетные записи пользователей django .

Этот модуль является частью экосистемы Пинакс , имеет хорошую документацию и, что самое главное, легкий для чтения код. Модуль может:

  • Зарегистрировать пользователя по электронной почте;
  • Отправьте электронное письмо со ссылкой для подтверждения;
  • Аутентифицировать пользователя с помощью электронной почты и пароля;
  • Сменить пароль от интерфейса;
  • Сброс и восстановление пароля;
  • Следить за разрушением пароля;
  • Изменить настройки учетной записи (например, языковой стандарт или часовой пояс);
  • Удалить аккаунт.


Монтаж

Для установки выполните команду:
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

pip install django-user-accounts

Не забудьте добавить зависимость в файл require.txt:

django-user-accounts==2.0.3

В settings.py добавьте INSTALLED_APPS:

INSTALLED_APPS =[ .

'django.contrib.sites', 'account' ]

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

Далее мы добавляем MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = [ .

'account.middleware.LocaleMiddleware', 'account.middleware.TimezoneMiddleware' ]

И context_processors:

TEMPLATES = [ { .

'OPTIONS': { 'context_processors': [ .

'account.context_processors.account' ], }, }, ]

Чтобы наш адрес электронной почты был уникальным и требовалось подтверждение, добавим в settings.py два ключа:

ACCOUNT_EMAIL_UNIQUE = True ACCOUNT_EMAIL_CONFIRMATION_REQUIRED = True

Теперь вы можете запустить миграцию:

python manage.py migrate

В результате в базе данных появятся новые таблицы:

account_account account_accountdeletion account_emailaddress account_emailconfirmation account_passwordexpiry account_passwordhistory account_signupcode account_signupcoderesult django_site

Если у вас ранее не был подключен модуль сайтов, то вам необходимо создать сайт:

python manage.py shell >>> from django.contrib.sites.models import Site >>> site = Site(domain='localhost:8000', name='localhost:8000') >>> site.save() >>> site.id 2

И добавьте идентификатор нового сайта в файл settings.py:

SITE_ID = 2

Все шаблоны необходимых страниц и текстов писем можно скачать на сайте Pinax-тема-бутстрап и просто поместите их в yourproject/yourapp/templates/account.

Настройки

Если вы собираетесь подключать этот модуль на уровне Django-приложения, а не проекта, то для корректной работы маршрутизации добавьте в settings.py следующие строки:

ACCOUNT_LOGIN_URL = 'yourapp:account_login' ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL = ACCOUNT_LOGIN_URL ACCOUNT_PASSWORD_RESET_REDIRECT_URL = ACCOUNT_LOGIN_URL ACCOUNT_EMAIL_CONFIRMATION_URL = "yourapp:account_confirm_email" ACCOUNT_SETTINGS_REDIRECT_URL = 'yourapp:account_settings' ACCOUNT_PASSWORD_CHANGE_REDIRECT_URL = "yourapp:account_password"

И добавьте URL-адреса в файл yourapp/urls.py:

urlpatterns = [ .

url(r"^account/", include("account.urls")), .

]

Сейчас доступны следующие адреса:

account/signup/ account/login/ account/logout/ account/confirm_email/<key> account/password/ account/password/reset/ account/password/reset/<token> account/settings/ account/delete/

Остается только добавить настройки почтового сервера в settings.py:

DEFAULT_FROM_EMAIL = '[email protected]' EMAIL_HOST = "smtp.yoursmtpserver.ru" EMAIL_PORT = 25 EMAIL_HOST_USER = "user" EMAIL_HOST_PASSWORD = "pass"

Если вы все сделали правильно, то вы сможете войти по указанным URL-адресам, используя свое имя пользователя/пароль, и когда вы создадите учетную запись, вам будет отправлено письмо для подтверждения вашей электронной почты.



Лирическое отступление

Был найден ошибка , что не позволяет корректно сформировать ссылку для восстановления пароля, если вы добавляли ссылки на приложение, а не на проект. Пока пул-реквест не будет принят, можно поставить костыль в файл yourproject/urls.py

from account.views import PasswordResetTokenView urlpatterns = [ .

url(r"^account/password/reset/(ЭP<uidb36>[0-9A-Za-z]+)-(ЭP<token>.

+)/$", PasswordResetTokenView.as_view(), name="account_password_reset_token"), .

]

В запросе на включение появится новая настройка:

ACCOUNT_PASSWORD_RESET_TOKEN_URL = 'yourapp:account_password_reset_token'



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

Сначала добавьте соответствующий бэкэнд в settings.py:

AUTHENTICATION_BACKENDS = [ 'account.auth_backends.EmailAuthenticationBackend', ]

Затем убираем имя пользователя из формы регистрации; для этого добавьте в файл yourapp/forms.py следующее:

import account.forms class SignupForm(account.forms.SignupForm): def __init__(self, *args, **kwargs): super(SignupForm, self).

__init__(*args, **kwargs) del self.fields["username"]

А в файле yourapp/views.py это:

import yourapp.forms import account.forms import account.views class LoginView(account.views.LoginView): form_class = account.forms.LoginEmailForm class SignupView(account.views.SignupView): form_class = yourapp.forms.SignupForm def generate_username(self, form): username = form.cleaned_data["email"] return username def after_signup(self, form): # do something super(SignupView, self).

after_signup(form)

Здесь мы устанавливаем классы форм для представлений: LoginEmailForm и нашу SignupForm соответственно, а также переопределяем метод after_signup, чтобы мы могли добавить в него какое-то нужное нам поведение.

По умолчанию мы присваиваем поле имени пользователя адрес электронной почты.

Остается только переопределить наши URL-адреса в файле yourapp/urls.py:

from .

import views urlpatterns = [ .

url(r"^account/login/$", views.LoginView.as_view(), name="account_login"), url(r"^account/signup/$", views.SignupView.as_view(), name="account_signup"), url(r"^account/", include("account.urls")), .

]

Обратите внимание, что вызов пользовательских представлений должен происходить до подключения account.urls, иначе они не будут переопределены.



Миграция старых данных

Чтобы текущие пользователи могли войти в систему, вам необходимо добавить их адреса электронной почты в таблицу account_emailaddress:

insert into account_emailaddress(email, verified, "primary", user_id) select au.email, True, True, au.id from auth_user au where au.email is not null

В этом случае в проверяемое поле подставляется значение true, т.е.

мы их сразу подтверждаем.

Чтобы у всех пользователей была учетная запись, заполните таблицу account_account:

insert into account_account (timezone, "language", user_id) select '','ru', id from auth_user



Заключение

Вы можете узнать больше о модуле django-user-account в официальная документация .

Исходный код находится здесь .

Это полезно прочитать, чтобы лучше понять, как работает механизм аутентификации Django. Надеюсь, эта статья поможет вам сэкономить время.

Поделитесь в комментариях, какими инструментами вы пользуетесь.

Теги: #аутентификация #электронная почта #веб-разработка #руководство #открытый исходный код #python #django

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.