目次
こんにちは。sinyです。
この記事では、django-social-authを使ってデモ動画のようなソーシャル認証(GoogleのIDを利用)を実装する手順を解説します。
認証ボタンのデザインも2種類用意し、本番サービスでも利用できるレベルのテンプレートになっていると思うので参考にして頂ければ幸いです。
完成形のソースコードは以下のGithubリポジトリにあります。
事前準備
まず、仮想環境の作成とアクティベート、必要なモジュールのインストールとDjangoプロジェクト、アプリケーションの作成まで完了させましょう。
仮想環境の作成とアクティベート
以下のコマンドを実行して仮想環境をアクティベートしましょう。
python -m venv env
env\scripts\activate
モジュールのインストール
以下のコマンドを実行してDjango本体とsocial-auth-app-djangoをインストールします。
pip install django social-auth-app-django
Djangoプロジェクトの作成
今回はconfigという名称のプロジェクトを作成します。
django-admin startproject config .
アプリケーションの作成
appという名称のアプリケーションを作成します。
python manage.py startapp app
Google認証
Googleのユーザ認証でログオンするために必要な クライアントキー と クライアントシークレット を取得します。
以下のGoolge Developers Console サイトにアクセスしましょう。
・[プロジェクトの選択] → [新しいプロジェクト] を押します。
・「プロジェクト名」を入れて「作成」ボタンを押します。
・画面左のナビゲーション→APIとサービス→認証情報を選択します。
・「認証情報を作成」ボタンを押し、「OAuthクライアントID]を選択します。
・「同意画面を設定」→User Typeは「外部」を選択→作成
・アプリ情報で「アプリ名、ユーザサポートメール、デベロッパーの連絡先情報」を入力し「保存して次へ」を3回押します。
・再度「認証情報」を選択→「認証情報を作成」→「OAuthクライアントID」を選択します。
・アプリケーションの種類で「ウェブアプリケーション」を選択し「承認済みのリダイレクト URI」に「http://127.0.0.1:8000/social-auth/complete/google-oauth2/」を指定し「作成」ボタンを押します。
「クライアントID」と「クライアントシークレット」が生成されるので控えておきましょう。
Djangoソーシャル認証のパラメータ設定
config/settings.pyを開いて以下の設定を追加します。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'social_django', #追加 'app', #追加 ]
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'social_django.middleware.SocialAuthExceptionMiddleware', #追加 ]
TEMPLATES
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], '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', 'social_django.context_processors.backends', #追加 ], }, }, ]
最後に末尾に以下の設定を追加します。
AUTHENTICATION_BACKENDS = [ 'social_core.backends.google.GoogleOAuth2', 'django.contrib.auth.backends.ModelBackend', ] LOGIN_URL = 'login' LOGIN_REDIRECT_URL = 'home' LOGOUT_URL = 'logout' LOGOUT_REDIRECT_URL = 'login' SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '<クライアントID>' SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '<クライアントシークレット>'
SOCIAL_AUTH_GOOGLE_OAUTH2_KEYとSOCIAL_AUTH_GOOGLE_OAUTH2_SECRETには自分のキー情報を設定しましょう。
ビューの定義
app/views.pyに以下のコードを定義します。
from django.shortcuts import render from django.contrib.auth.decorators import login_required def login(request): return render(request, 'login.html') @login_required def home(request): return render(request, 'home.html')
ビューはソーシャル認証画面を表示するためのlogin関数とログオン後の画面を表示するhome関数だけ定義しています。
URLパターンの定義
次にapp/urls.pyを新規に作成し、URLパターンを以下の通り設定します。
from django.urls import path, include from django.contrib.auth import views as auth_views from app import views urlpatterns = [ path('login/', views.login, name='login'), path('logout/', auth_views.LogoutView.as_view(), name='logout'), path('social-auth/', include('social_django.urls', namespace='social')), path("", views.home, name='home'), ]
ログイン用のURLパターンは先ほどビューで定義したlogin関数を呼び出すようにします。
ログアウトについてはDjangoが標準で提供するauth_views.LogoutViewを呼び出すようにします。
また、以下でdjango-social-authの機能を使えるようにしています。
path('social-auth/', include('social_django.urls', namespace='social')),
app/urls.pyをincludeする設定をconfig/urls.pyに追加しておきます。
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('app.urls')), ]
以上でURLパターンの定義は完了です。
テンプレートの設定
最後にテンプレートを作成します。
まずは必要な静的ファイルを配置します。
sinjorjob / django-social-authをgitcloneした後に、django-social-auth/source/app/static/フォルダを丸ごとappフォルダ直下にコピーします。
次にapp/templatesフォルダを作成し、直下にlogin.htmlとhome.htmlを以下の通し作成します。
login.html
{% load static %} <!doctype html> <html lang="ja"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link href="https://fonts.googleapis.com/css?family=Roboto:300,400&display=swap" rel="stylesheet"> <link rel="stylesheet" href="{% static 'fonts/icomoon/style.css' %}"> <link rel="stylesheet" href="{% static 'css/owl.carousel.min.css' %}"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"> <!-- Style --> <link rel="stylesheet" href="{% static 'css/style.css' %}"> <!-- google login css--> <link rel="stylesheet" href="{% static 'css/google.css' %}" /> <title>Login #6</title> </head> <body> <div class="d-lg-flex half"> <div class="bg order-1 order-md-2" style="background-image: url('/static/images/bg_1.jpg');"></div> <div class="contents order-2 order-md-1"> <div class="container"> <div class="row align-items-center justify-content-center"> <div class="col-md-7"> <div class="mb-4"> <h3>Sign In</h3> <p class="mb-4">django-social-auth</p> </div> <form action="#" method="post"> <div class="social-login"> <a href="{% url 'social:begin' 'google-oauth2' %}" class="google btn d-flex justify-content-center align-items-center"> <span class="icon-google mr-3"></span> Sign in with Google </a> </div> <div class="row"> <div class="col-md-8 mx-auto my-2 order-md-1"> <button class="login-with-google-btn"> <a href="{% url 'social:begin' 'google-oauth2' %}"> Sign in with Google</a> </button> </div> </div> </form> </div> </div> </div> </div> </div> <script src="{% static 'js/jquery-3.3.1.min.js' %}"></script> <script src="{% static 'js/popper.min.js' %}"></script> <script src="{% static 'js/bootstrap.min.js' %}"></script> <script src="{% static 'js/main.js' %}"></script> </body> </html>
認証ボタンのaタグのhref属性に以下を設定することでソーシャル認証画面に飛ぶようになります。
<a href="{% url 'social:begin' 'google-oauth2' %}"
今回は以下の2種類の認証ボタンのデザインを用意しています。
home.html
{% load static %} <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> <link rel="stylesheet" href="{% static 'css/index.css' %}" /> <!-- google login css--> <link rel="stylesheet" href="{% static 'css/google.css' %}" /> <title>Django Social Auth</title> </head> <body> <div class="container-fluid"> <div> <h1 class="text-white text-center">{% block title %}{% endblock %}</h1> <div class="card p-5"> <div class="row"> <div class="col-sm-12 mb-3"> <h4 class="text-center text-black">ようこそ{{ user.first_name }}さん!</h4> </div> <div class="row"> <div class="col-md-8 mx-auto my-2 order-md-1"> <button class="login-with-google-btn"> <a href="{% url 'logout' %}"> Logout</a> </button> </div> </div> </div> </div> </div> </div> </body> </html>
ログオン後に遷移するhome.htmlにはログアウト機能をつけるため以下のコードを追加しています。
<button class="login-with-google-btn"> <a href="{% url 'logout' %}"> Logout</a> </button>
URLパターン(logout)を設定しておくことで、ログアウトボタンを押した際にDjangoが標準で提供するログアウト機能(auth_views.LogoutView.as_view())が呼び出されてログアウトするようになっています。
以上で以下のようなDjangoでソーシャル認証を実装することができます。
以上、「Djangoソーシャル認証を実装する(Google認証)」でした。