
Part1 Djangoのallauthライブラリでユーザー認証からソーシャルアカウントログイン
この記事は、簡単に様々なユーザー認証が実現できるdjango-allauthの基本について解説していきます。
Djangoの詳細についてわからない人は、下のリンクから理解を深めてください。↓
マガジン(『超入門』Djangoで作る初めてのウェブアプリケーション)
開発準備
ターミナルで仮想環境、プロジェクトを作り、マイグレート 、サーバーを起動させます。
$ mkdir django && cd django
$ python -m venv my_venv
$ source my_venv/bin/activate
(my_venv) $ pip install django~=3.1.0
(my_venv) $ django-admin.py startproject auth_project
(my_venv) $ cd auth_project
(my_venv) $ python manage.py runserver
下のようにロケットが打ち上がれば成功です。(http://127.0.0.1:8000/)
続いてsettings.pyを開いて、プロジェクトディレクトリ直下でtemplatesフォルダを読み込むためにDIRSを設定して、時間と言語を変更しましょう。
/auth_project/settings.py
# 省略
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], #追加
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
# 省略
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
allauthのインストール
サーバーを止めてallauthをインストールします。
(my_venv) $ pip install django-allauth
インストールできたら設定を行います。
開いていたsettings.pyを以下のように編集します。
# 省略
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites', # 追加
'allauth', # 追加
'allauth.account', # 追加
'allauth.socialaccount', # 追加
]
# 省略
# 以下全て追加↓
# メール送信の設定
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.googlemail.com'
EMAIL_USE_TLS = True
EMAIL_PORT = 587
EMAIL_HOST_USER = 'あなたの@gmail.com'
EMAIL_HOST_PASSWORD = 'あなたのアプリパスワード'
LOGIN_REDIRECT_URL = '/' # ログイン後の遷移先
LOGOUT_REDIRECT_URL = '/' # ログアウト後の遷移先
AUTHENTICATION_BACKENDS = (
# Needed to login by username in Django admin, regardless of `allauth`
"django.contrib.auth.backends.ModelBackend",
# `allauth` specific authentication methods, such as login by e-mail
"allauth.account.auth_backends.AuthenticationBackend",
)
SITE_ID = 1
ACCOUNT_EMAIL_REQUIRED = True # Eメール必須
ACCOUNT_USERNAME_REQUIRED = True # ユーザー名必須
ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE = True # パスワード2回入力
ACCOUNT_SESSION_REMEMBER = True
ACCOUNT_AUTHENTICATION_METHOD = 'email' # Eメールで認証を行う
ACCOUNT_UNIQUE_EMAIL = True # 一意なEメール
ACCOUNT_EMAIL_VERIFICATION = 'mandatory' # Eメール送信
簡単に説明します。
INSTALLED_APPSに追加したものはallauthを使用するために必要なappです。
そして今回は、GMAILを送信したいので設定をしています。
GMAILのアプリパスワードなどの設定がわからない方は以下のリンクで説明しています。
Djangoで作る初めてのウェブアプリケーション(番外編)お問い合わせ機能
続いてurls.pyの設定です。
auth_project/urls.py
from django.contrib import admin
from django.urls import path, include #追加
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/', include('allauth.urls')), # 追加
]
Djangoフレームワーク慣習のincludeをインポートします。
allauthのURLは、include('allauth.urls')とする事で読み込みできます。
allauthを上のようにurls.py読み込むと以下のURLパターンが自動で生成させます。
accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']
accountsアプリの作成
まだアプリを作っていないのでターミナルでアプリを作りましょう。
python manage.py startapp accounts
アプリが完成したら、settings.pyでアプリを登録します。
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'accounts', # 追加
'django.contrib.sites',
'allauth',
'allauth.account',
'allauth.socialaccount',
]
ユーザーモデルを作っていくのですが、今後の拡張性も考慮して、カスタムユーザーモデルを作ります。(本来Djangoではカスタムユーザーモデルを使用することを推奨しています)
auth_project/accounts/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
# add additional fields in here
def __str__(self):
return self.email
カスタムユーザーの作り方は複数ありますが、説明は割合させていただきます。今回はAbstractUserクラスをCustomUserクラスで継承します。
models.py内のコメントにも書いてありますがこのCustomUserクラスの中に加えたいフィールドがあれば加えることが可能です。試してみてください。
CustomUserを使用するにはsettings.pyに明記する必要があります。これを忘れるとCustomUserが使用できません。
settings.py
AUTH_USER_MODEL = 'accounts.CustomUser'
ここでまでできたらマイグレーションしてマイグレートを実行します。
python manage.py makemigrations
python manage.py migrate
そして、スーパーユーザーを作りましょう。
python manage.py createsuperuser
スーパーユーザーができたらサーバーを起動して以下のURLにアクセスしてみましょう。
python manage.py runserver
ログインページ
http://127.0.0.1:8000/accounts/login/
サインアップページ
http://127.0.0.1:8000/accounts/signup/
上の写真のようにallauthが用意してくれているページにアクセスできると思います。
forms.pyとadmin.pyの編集
将来的にCustomUserクラスに追加フィールドを足した時のためにCustomUserCreationFormとCustomUserChangeFormを作っておきましょう。
forms.pyは自身で作成します。
accounts/forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser
class CustomUserCreationForm(UserCreationForm):
class Meta:
model = CustomUser
fields = ('username', 'email')
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = CustomUser
fields = ('username', 'email')
adminページにユーザーモデルを表示するためにadmin.pyを以下のようにします。
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import CustomUser
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
form = CustomUserChangeForm
model = CustomUser
list_display = ['email', 'username',]
admin.site.register(CustomUser, CustomUserAdmin)
forms.pyとadmin.pyの編集ができたら、実際に確認してみましょう。
以下のように左のサイドバーに”ユーザー”が追加されていると思います。
テンプレートの作成
今のままではログイン、ログアウトした時のページ遷移先のHTMLがないので非常に不便なので作っていきましょう。
最初にsettings.pyでプロジェクトディレクトリ直下のtemplatesフォルダを読み込むように最初に設定しました。
そのため以下のディレクトリにtemplatesフォルダを作り、さらにその中にbase.htmlとindex.htmlを作ります。
templates/base.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{% block title %}Django練習{% endblock %}</title>
</head>
<body>
<main>
{% block content %}
{% endblock %}
</main>
</body>
</html>
templates/index.html
{% extends 'base.html' %}
{% block title %}Index{% endblock %}
{% block content %}
{% if user.is_authenticated %}
こんにちは {{ user.username }}様!
<p><a href="{% url 'account_logout' %}">ログアウト</a></p>
{% else %}
<p>あなたはログアウトしています。</p>
<a href="{% url 'account_login' %}">ログイン</a>
<a href="{% url 'account_signup' %}">新規登録</a>
{% endif %}
{% endblock %}
URLの設定
baseとindex.htmlができたところでindexページをhttp://127.0.0.1:8000/で表示するようにurls.pyを以下のように編集します。
auth_project/urls.py
from django.contrib import admin
from django.urls import path, include
from django.views.generic.base import TemplateView # 追加
urlpatterns = [
path('admin/', admin.site.urls),
path('', TemplateView.as_view(template_name='index.html'), name='index'), # 追加
path('accounts/', include('allauth.urls')),
]
TemplateViewをインポートしてindex.htmlを返してあげます。
これでトップページが完成しました。
実際に登録してみましょう
ここまで完成したら一連の流れを確認します。
登録→確認メール→認証→ログインという流れになります。
現在ログイン中の人は一度ログアウトして新規登録を行ってください。
ログアウトURL→http://127.0.0.1:8000/accounts/logout/
トップページ(index.html)
新規登録
メール送信完了
メールを開いてリンクをクリックしてください。
トップページ
以上で一連の流れの確認ができました。
最後に
次回からは独自でテンプレを用意して見た目をすっきりさせソーシャルアカウントで登録からログインまでできるようにします。