🐍
【Python】DjangoでLINE、Google、Facebookのソーシャルログインを導入する手順
達成目標
django-allauth
を用いて、ソーシャルログイン機能を実装することができる。
表示させたいログイン画面
django-allauth
インストール
1.パッケージであるdjango-allauthをインストールする
docker-compose exec web pip install django-allauth
現在インストールされているパッケージとそのバージョンをrequirements.txtへ出力
docker-compose exec web pip freeze > requirements.txt
settings.py
の編集
2.django-allauthの設定(INSTALLED_APPS)
INSTALLED_APPS = [
'django.contrib.sites', # 追加
'allauth', # 追加
'allauth.account', # 追加
'allauth.socialaccount', # 追加
'allauth.socialaccount.providers.google', # 追加(Google Providers)
'allauth.socialaccount.providers.facebook', # 追加(facebook Providers)
'allauth.socialaccount.providers.line', # 追加(line Providers)
]
django-allauthの設定(AUTHENTICATION_BACKENDS)
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend', # 追加(Djangoのデフォルト認証)
'allauth.account.auth_backends.AuthenticationBackend', # 追加(allauthの認証)
]
django-allauthの設定(その他)
SITE_ID = 1 # 必須(後程出てくるSiteテーブルのIDと同じにする)
LOGIN_REDIRECT_URL = '/' # ログイン後のリダイレクト先
ACCOUNT_EMAIL_VERIFICATION = 'none' # メール認証
SITE_IDとは
settings.py
INSTALLED_APPS = [
'django.contrib.sites'
]
- INSTALLED_APPSに
'django.contrib.sites'
の記述を行うと、Django-admin
にてSite
テーブルが作成される。
- ドメイン名や表示名を登録し、コード内でSiteモデルをインポートして動的にURIや設定を変更することができる。
from django.contrib.sites.models import Site
# 現在のSiteを取得
current_site = Site.objects.get_current()
# 現在のドメイン名と名前を取得
print(current_site.domain) # 例: localhost:8000
print(current_site.name) # 例: My Local Site
# ドメイン名と名前を変更
current_site.domain = "newdomain.com"
current_site.name = "New Domain Name"
current_site.save()
# サイトIDで直接取得
site = Site.objects.get(id=1)
print(site.domain) # 変更後: newdomain.com
- その他、本番環境と開発環境のURL定義、複数のサイトを運営する場合、ソーシャルログインのカスタマイズなどに用いる。
urls.py
の編集
3.urls.pyファイルに以下を追加する
from django.contrib import admin
from django.urls import path, include # 追加
urlpatterns = [
path('admin/', admin.site.urls), # 追加
path('social-auth/', include('allauth.urls')), # 追加
path('', include("accounts.urls"))
]
4.マイグレーションの実行
コンテナが起動している場合はDocker環境を再起動
docker-compose down
docker-compose up
マイグレーションの実行
docker-compose exec web python manage.py migrate
5.各プロバイダーでアプリを作成
以下URLにアクセスし、新しいプロジェクトを作成
ナビゲーションバーからAPIとサービス>OAuth同意画面をクリック
User Typeは外部を選択し、作成を押下
アプリ名、ユーザーサポートメール、デベロッパーの連絡先情報を入力し、保存して次へを押下
スコープはそのまま保存して次へを押下
テストユーザーもそのまま保存して次へを押下
内容を確認し、ダッシュボードへ戻るを押下
サイドバーの認証情報を押下後、画面上部の+認証情報の作成を押下
OAuthクライアントIDを押下
OAuthクライアントの情報を以下を参考に入力し、作成を押下
承認済みの JavaScript 生成元
http://localhost:8000
承認済みのリダイレクト URI
http://127.0.0.1:8000/accounts/google/login/callback/
Client ID
とClient Secret
が生成されたのでメモ帳などにコピーする(以降に使用)
表示されたfacebook(作成中)
LINE(作成中)
Django admin
の設定
6.
Django admin
(http://127.0.0.1:8000/admin
)のログインする
Sites
とSocial Accounts
が追加されていることを確認する
Sites
を押下し、以下の画面を参考に内容を登録する
Social Accounts
のSocialAccount
を押下し、内容を登録する
Uidとエクストラデータとは
-
Uid
Uid(User ID)は、ソーシャルプロバイダー(例: Google、Facebook)によって一意に付与されるユーザーIDです。このIDを使用して、Djangoアプリ内でユーザーアカウントをソーシャルプロバイダー上のアカウントに紐付けます。 -
エクストラデータ
エクストラデータは、ソーシャルログイン時にプロバイダから取得した追加のユーザー情報をJSON形式で保存するフィールドです。必須ではない。
Social Accounts
のSocialApplication
を押下し、内容を登録する
項番4のGoogle
で作成したOAuthクライアントのIDとクライアントシークレットが必要
keyの部分は空欄でもよい
7.テンプレートファイルの読み込み
テンプレートフォルダとテンプレートファイルの横巫女
以下のコマンドでwebコンテナ内に入る
docker-compose exec web bash
プロジェクトフォルダ配下にtemplatesフォルダおよびaccountフォルダを配置
mkdir -p /app/templates/account
allauthのパッケージ内にあるテンプレートを先ほど作成したフォルダ内にコピーする
cp -r /usr/local/lib/python3.11/site-packages/allauth/templates/account/* /app/templates/account/
※Bashに入ると、通常のWindowsのコピペ(Ctrl+C, Ctrl+V)が直接的に機能しないため、コピーして、右クリックをして貼り付ける。
Bashシェルから抜ける
Ctrl + D
Dockerからそのままコピーしたい場合
docker cp コマンドを用いるが、
docker cp /usr/local/lib/python3.11/site-packages/allauth/templates/account /app/templates/
テンプレートフォルダがコピーされたかを確認
成功すると以下のようなフォルダが配置される。
テンプレートファイルの編集
login.htmlに以下を追加
templates/accounts/login.htmlに以下を追加
{% extends "account/base.html" %}
{% load i18n %}
{% load account socialaccount %}
{% block head_title %}{% trans "Sign In" %}{% endblock %}
{% block content %}
<h1>{% trans "Sign In" %}</h1>
{% get_providers as socialaccount_providers %}
{% if socialaccount_providers %}
<p>{% blocktrans with site.name as site_name %}Please sign in with one
of your existing third party accounts. Or, <a href="{{ signup_url }}">sign up</a>
for a {{ site_name }} account and sign in below:{% endblocktrans %}</p>
<div class="socialaccount_ballot">
<ul class="socialaccount_providers">
{% include "socialaccount/snippets/provider_list.html" with process="login" %}
</ul>
<div class="login-or">{% trans 'or' %}</div>
</div>
{% include "socialaccount/snippets/login_extra.html" %}
{% else %}
<p>{% blocktrans %}If you have not created an account yet, then please
<a href="{{ signup_url }}">sign up</a> first.{% endblocktrans %}</p>
{% endif %}
<form class="login" method="POST" action="{% url 'account_login' %}">
{% csrf_token %}
{{ form.as_p }}
{% if redirect_field_value %}
<input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
{% endif %}
<!-- Password Reset Link -->
<a class="button secondaryAction" href="{% url 'account_reset_password' %}">{% trans "Forgot Password?" %}</a>
<!-- Submit Button -->
<button class="primaryAction" type="submit">{% trans "Sign In" %}</button>
</form>
{% endblock %}
8.ログインの確認
http://127.0.0.1:8000/accounts/login/
にアクセスし、ボタンが表示されているかを確認
ログイン画面
エラー画面を確認する(おそらく出現している)
templates/account/base.html
の一番上に記述を追加する。
日本語翻訳に関わる記述をbase.htmlの<!DOCTYPE html>の上に記述する
{% load i18n %}
http://127.0.0.1:8000/accounts/login/
にアクセスし、ボタンが表示されているかを確認
再度
ログイン画面
ボタンを押下後、ソーシャルログイン(今回は、Google)の画面に遷移されるかを確認し、続けるボタンを押下。
続けるボタンを押下
ログイン画面が表示されるのを確認
表示させたいログイン画面
Discussion