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

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

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

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



```terminal
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メールの期限が切れるまでの時間を設定する。このコード内に記載されている物の他に[公式ドキュメント](https://django-allauth.readthedocs.io/en/latest/configuration.html)にとても詳しく例がおいてある。

```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)](https://github.com/pennersr/django-allauth/blob/master/allauth/account/urls.py)を参照する。

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

```
<a href="{% url "account_login" %}"></a>
```
のように通常と同じ表記で対応する。

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

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

##参照記事
[The complete django-allauth guide](https://dev.to/gajesh/the-complete-django-allauth-guide-la3)
[Django-allauth tutorial](https://dev.to/learndjango/django-allauth-tutorial-n2k)
[Django allauthにおけるログイン画面の作成](https://qiita.com/kwashi/items/8421cf45bfaee9e6e238)
[django-allauth : テンプレートのカスタマイズ](https://torajirousan.hatenadiary.jp/entry/2019/04/07/024709)
[公式ドキュメント](https://django-allauth.readthedocs.io/en/latest/index.html)