LoginSignup
7
7

More than 3 years have passed since last update.

Django-allauthでユーザー認証を使う

Last updated at Posted at 2020-07-26

はじめに

高校一年生のプログラミング初心者です。Qiitaで記事を書くのは初めてなので多少の間違いがあるかもしれません。

django-allauthとは何か

django-allauthとはDjangoを使用したUser周りの処理を簡単に実装できるようにしたモジュールです。Eメールを使用した認証方法などが実装でき、またソーシャルログインなどの実装もこのモジュールを使用することによって比較的簡単に実装できるようになっています。

インストール/設定

pipでdjango-allauthのインストールをする。

pip install django-allauth

settings.pyのINSTALLED_APPS内において必要なソーシャルログインの数だけコードを書き加える。

main_project/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',

    # 必要に応じたソーシャルログイン用の記述を書く
    'allauth.socialaccount.providers.github',
    'allauth.socialaccount.providers.facebook',
]
main_project/settings.py
#allauthのバックエンドを使用していることを示す
AUTHENTICATION_BACKENDS = (
    "django.contrib.auth.backends.ModelBackend",
    "allauth.account.auth_backends.AuthenticationBackend",
)

#allauthが使用するためSITE_IDを指定する
SITE_ID = 1

Djangoがallauth純正のテンプレートを探し出す前にtemplates内のファイルを参照するようにsettings.py内の記述を書き換える。これはall-authの純正テンプレートには必要最低限の機能しか表示されず、多くの場合では見た目を変えるからである。下記の記述により自分で作成したテンプレートが純正のものよりも先に探される。

main_project/settings.py
TEMPLATES = [
  {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.normpath(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',
                'django.template.context_processors.request',
            ],
        },
    },
]

settings.pyにプロジェクトの認証方法や認証用に送ったEメールの期限が切れるまでの時間を設定する。このコード内に記載されている物の他に公式ドキュメントにとても詳しく例がおいてある。

main_project/settings.py
#emailによって認証する
ACCOUNT_AUTHENTICATION_METHOD = "email"
ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 2
ACCOUNT_EMAIL_REQUIRED = True
#アカウント認証用のEmailを"optional"、"mandatory"、"none"から選ぶ。
ACCOUNT_EMAIL_VERIFICATION = "optional"

最後にmakemigrationsまたはmigrateをしておく。
python manage.py makemigrations

urls.py/テンプレートの記載

先ほどsetting.py内のTEMPLATESにおいて純正より先にBASE_DIRにあるtemplatesを参照するように設定したのでtemplatesと名付けたフォルダーをmanage.pyと同じディレクトリに配置する。

プロジェクト内のurls.pyにおいてaccountsをincludeする。

main_project/urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include #includeを追加


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

allauthによって用意されているurls.pyのパスを確認するには仮想環境内の
site-packages/allauth/account/urls.py、もしくはここ(Github)を参照する。

HTMLファイル内でallauthのパスを使ってテンプレートへのリンクを明記したいときは

<a href="{% url "account_login" %}"></a>

のように通常と同じ表記で対応する。

まとめ

Django-allauthは日本語の記事が少ないと感じたので改めて記事を書いてみました。間違い等があるようでしたら是非ご指摘ください。

追記

元タイトルの「Django-allauthでUserモデルを作る」は誤解を生む可能性があるためタイトルを変更しました。

参照記事

The complete django-allauth guide
Django-allauth tutorial
Django allauthにおけるログイン画面の作成
django-allauth : テンプレートのカスタマイズ
公式ドキュメント

7
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7