Всем привет! Аутентификация пользователей уже давно является распространенной задачей.
Django, как и любой современный веб-фреймворк, имеет отличный механизм аутентификации пользователей.
Однако этот механизм по умолчанию использует в качестве идентификатора логин, тогда как мы все уже привыкли использовать для входа электронную почту.
Когда мне понадобилось реализовать этот функционал, оказалось, что туториалов, особенно на русском языке, не так много, в которых описывалось бы, как зарегистрироваться по электронной почте, отправить проверочное письмо, сбросить пароль и другие, в общем-то, вполне обычные вещи.
Я решил исправить эту несправедливость.
Немного покопавшись в интернете мой выбор пал на модуль учетные записи пользователей django .
Этот модуль является частью экосистемы Пинакс , имеет хорошую документацию и, что самое главное, легкий для чтения код. Модуль может:
- Зарегистрировать пользователя по электронной почте;
- Отправьте электронное письмо со ссылкой для подтверждения;
- Аутентифицировать пользователя с помощью электронной почты и пароля;
- Сменить пароль от интерфейса;
- Сброс и восстановление пароля;
- Следить за разрушением пароля;
- Изменить настройки учетной записи (например, языковой стандарт или часовой пояс);
- Удалить аккаунт.
Монтаж
Для установки выполните команду:Не забудьте добавить зависимость в файл require.txt:pip install django-user-accounts
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
-
Как Создать Резервную Копию В Windows 7?
19 Oct, 24 -
Метаданные S3 В Postgresql. Лекция Яндекса
19 Oct, 24