見出し画像

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/)

スクリーンショット 2021-01-05 16.11.23

続いて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/

スクリーンショット 2021-01-05 21.39.11

サインアップページ
http://127.0.0.1:8000/accounts/signup/

スクリーンショット 2021-01-05 21.39.24

上の写真のようにallauthが用意してくれているページにアクセスできると思います。

forms.pyとadmin.pyの編集

将来的にCustomUserクラスに追加フィールドを足した時のためにCustomUserCreationFormCustomUserChangeFormを作っておきましょう。
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の編集ができたら、実際に確認してみましょう。

http://127.0.0.1:8000/admin/

以下のように左のサイドバーに”ユーザー”が追加されていると思います。

スクリーンショット 2021-01-05 21.50.56

テンプレートの作成

今のままではログイン、ログアウトした時のページ遷移先のHTMLがないので非常に不便なので作っていきましょう。

最初にsettings.pyでプロジェクトディレクトリ直下のtemplatesフォルダを読み込むように最初に設定しました。

そのため以下のディレクトリにtemplatesフォルダを作り、さらにその中にbase.htmlindex.htmlを作ります。

スクリーンショット 2021-01-05 21.57.16

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)

スクリーンショット 2021-01-06 6.10.10

新規登録

スクリーンショット 2021-01-06 6.10.40

メール送信完了

メールを開いてリンクをクリックしてください。

スクリーンショット 2021-01-06 6.13.20

トップページ

スクリーンショット 2021-01-06 6.19.17

以上で一連の流れの確認ができました。

最後に

次回からは独自でテンプレを用意して見た目をすっきりさせソーシャルアカウントで登録からログインまでできるようにします。

Part2 Djangoのall-authライブラリでユーザー認証からソーシャルアカウントログイン

この記事が気に入ったらサポートをしてみませんか?