Djangoアプリにdjango-allauthを使ってソーシャル認証機能を実装する方法について解説します。
django-allauthはアカウント作成やログインなどの認証機能を提供してくれるパッケージで、Django標準のdjango.contrib.authが提供してくれる最低限の機能に加えて、GitHubやGoogle、Twitterなどのソーシャルアカウントとの連携やログイン失敗回数制限などの機能もサポートしてくれています。
※この記事では弊サイトの Django入門編 を終えている前提で進めます。また、機能の実装先もDjango入門編で制作した掲示板アプリをベースに進めていきます。
目次
各ソーシャルプロバイダから連携するAPIKeyを入手
今回はTwitterのOAuth認証を実装します。
はじめに各ソーシャルプロバイダからアプリと連携するためのAPIKeyを入手しましょう。
Twitter APIキーの発行・利用申請手順については下記サイト様をご参照ください。
【Twitter】APIキー利用申請から発行までの手順解説|ツイッター運用自動化アプリ作成に向けた環境構築
開発者アカウントの登録とソーシャルプロバイダへのアプリの登録が完了したら
- API key
- API Key Secret
がそれぞれ発行されるので控えておきます。
また、アプリのcallbackURL(ログインしたあとのリダイレクト先URL)も設定しておきましょう。
ここでは
http://127.0.0.1:8000/accounts/twitter/login/callback/
として進めていきます。
django-allauthのインストール
django-allauthはDjango標準のモジュールではないため別途インストールする必要があります。
PowerShellでDjangoプロジェクトのディレクトリに移動して次のコマンドでインストールしましょう。
pip install django-allauth
設定
django-allauthを使うために各種設定を行います。
まずはsettings.pyにdjango-allauthの各種アプリケーションを登録します。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'hello.apps.HelloConfig', 'bbs.apps.BbsConfig', 'accounts.apps.AccountsConfig', 'django.contrib.sites', # 追加 'allauth', # 追加 'allauth.account', # 追加 'allauth.socialaccount', # 追加 'allauth.socialaccount.providers.twitter', # 追加 ]
今回はTwitterを使うので
allauth.socialaccount.providers.twitter
を登録していますが、これは認証プロバイダごとに設定が必要です。
例えば次のように記述します。
allauth.socialaccount.providers.google # googleの場合 allauth.socialaccount.providers.github # githubの場合
また、同じくsettings.pyに次のパラメータを設定します。
AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.ModelBackend', 'allauth.account.auth_backends.AuthenticationBackend', ] SITE_ID = 1 #django-allauthを利用する際に必要な設定 LOGIN_REDIRECT_URL = '/bbs/' # ログイン後のリダイレクト先URL ACCOUNT_LOGOUT_REDIRECT_URL = '/accounts/login/' # ログイン画面のURL
今回はこれだけですが、他にも次のようなパラメータを設定できます。
ACCOUNT_AUTHENTICATION_METHOD = 'email' # email+パスワード認証方式を指定 ACCOUNT_USERNAME_REQUIRED = False # ユーザ名を利用しない設定にする SITE_ID = 1 #django-allauthを利用する際に必要な設定 LOGIN_REDIRECT_URL = 'home' # ログインURLの設定 LOGIN_URL = '/accounts/login/' #ログイン画面を何処にするかの設定 ACCOUNT_LOGOUT_REDIRECT_URL = '/accounts/login/' #ログアウトリダイレクトの設定 ACCOUNT_EMAIL_VERIFICATION = 'mandatory' #ユーザ登録確認メールを送信する ACCOUNT_EMAIL_REQUIRED = True #メールアドレスを必須項目に指定 EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' #コンソール上にメッセージを表示
ルーティング
django-allauthの各ページ用のルーティングを記述します。
urlpatterns = [ path('bbs/', include('bbs.urls')), path('hello/', include('hello.urls')), path('admin/', admin.site.urls), # path('accounts/', include('accounts.urls')), # path('accounts/', include('django.contrib.auth.urls')), path('accounts/', include('allauth.urls')), #追加 ]
ユーザー管理にdjango-allauthを使うので、標準のdjango.contrib.auth.urlsを使用している場合はコメントアウトしておきます。
path('accounts/', include('allauth.urls')),
この1行を追加するだけで、django-allauthがデフォルトで設定している認証関係のページを利用する事ができます。
URL | 認証内容とURL name |
---|---|
/accounts/login/ | Login (account_login) |
/accounts/signup/ | Signup (account_signup) |
/accounts/logout/ | Logout (account_logout) |
/accounts/password/set/ | Password Set(account_set_password) |
/accounts/password/change/ | Password Change(account_change_password) |
/accounts/password/reset/ | Password Reset (account_reset_password) |
/accounts/email/ | E-mails Management (account_email) |
マイグレーション
django-allauth用のテーブルをデータベースに反映させる必要があるのでマイグレーションします。
python manage.py migrate
管理アカウントでDjangoAdminにログインすると、次のように「外部アカウント」のテーブルが追加されているのが確認できます。
ソーシャルアプリケーションを追加
APIキーを設定しましょう。
「ソーシャルアプリケーション」をクリック。
「ソーシャルアプリケーションを追加」からレコードを追加します。
必要な情報を入力し、サイトも選択して「保存」します。
動作確認
では動作確認です。
Webサーバーを起動し、http://127.0.0.1:8000/accounts/login/ にアクセスします。
ログイン画面が表示されます。
をクリックすると
Twitterログインの確認ページが表示されるので「続ける」をクリック。
よく見る認証画面が出たあとで
ログイン後の画面に遷移します。
ソーシャルアカウントによるOAuth認証があればユーザーの敷居が低くなります。
ログインが必要なアプリではできる限り実装しておきたい機能ですね。