Djangoでallauthを使ってメールの2段階認証を実装する


やること

Djangoでallauthを使ってユーザ登録機能を作る。
仮登録→メールが送信される→メールの中のリンクをクリックして本登録完了 の流れ。
今回はメールを送信する代わりにメールの文面をコンソールに表示する。

完成例はこちら↓ (多少カスタマイズしているので、完全に同じものができるわけではない。特に本登録完了画面)




allauthでは、会員登録だけでなく、ログイン・ログアウト・パスワード再設定・Facebookやgoogleなどによるソーシャルログイン機能なども実装することができるが、今回はユーザ登録のみを作る。

前提

ユーザ登録機能を作るプロジェクトは作成済みとする。

環境

Ubuntu20-04
Django3.1
django-allauth 0.42.0

手順

①django-allauthのインポート

pip install django-allauth でインポートできる。

②ユーザ認証用のアプリケーション「accounts」を作成

python manage.py startapp accounts

③settings.py

下記の#の部分を追加する。

settings.py
TEMPLATES = [
  {
     'BACKEND': 'django.template.backends.django.DjangoTemplates',
     'DIRS': [],
     'APP-DIRS': True,
     'OPTIONS': {
          'context_processors': [
               `django.template.context_processors.request',#
           ],
      },
   },
]

AUTHENTICATION_BACKENDS = [
#allauthのあるなしにかかわらず、管理画面にユーザーネームでログインするのに必要
    'django.contrib.auth.backends.Modelbackend',

#allauthを使うときに必要
    'django.account.auth_backends.AuthenticationBackend',#
]

INSTALLED_APPS = [
    'django.contrib.auth',#
    'django.contrib.messages',#
    'django.contrib.sites',#
    'allauth',#
    'allauth.account',#
    'allauth.socialaccount',#
]

SITE_ID = 1

#ユーザ登録確認メールを送信
ACCOUNT_EMAIL_VARIFICATION = 'mandatory'
ACCOUNT_EMAIL_REQUIRED = True

#コンソール上にユーザ登録確認メールを表示。ローカルで確認するため
EMAIL_BACKEND = 'django.core.backends.console.EmailBackend' 

ACCOUNT_EMAIL_VARIFICATIONのところで、'mandatory'にすると確認メールが送られ、'none'にするとメールは送られない。

④urls.py

urls.py
from django.urls import path, include

urlpatterns = [
    path('accounts/', include('allauth.urls')),
]

ユーザ登録ページのurlやテンプレートは不要。allauthが提供しているため。
(ただしデザインはあんまりなので、カスタマイズした方がいい。でもこの記事では扱わない)
ちなみに、allauthが提供しているurlは、以下で確認できる。
Django - Django Allauthを使う | django Tutorial

⑤マイグレーション

python manage.py migrateを実行する。

⑥確認

python manage.py runserverを実行して、localhost:8000/accounts/signup/ にアクセスする。

終わりに

自分が会員登録機能を作っていて少し手間取ったので、覚え書きとして書きました。
筆者はDjango初心者です。間違っているところがある可能性が大いにあるので、発見された際はご指摘いただけるとありがたいです。

参考

Welcome to django-allauth! -django-allauth 0.32.0
爆速で作れるDjangoユーザ認証機能【django-allauth】