DjangoでGoogleログイン認証

desk3 CODE

本記事では、 Google OAuth2を用いてDjangoアプリでGoogle認証を簡単に行う方法を紹介します。

social-auth-app-djangoというサードパーティーのパッケージが手軽に実装できるので便利です。

Google以外にもTwitterやFaceBookなどのソーシャルメディア認証にも使用できます。

 

準備

パッケージをインストール。

pip3 install social-auth-app-django
social-auth-app-djangoはPython Social AuthをDjango様にラップしたパッケージで、OAuth、OAuth2認証に必要な機能は全て含まれています。

 

settings.pyにアプリを追加。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'social_django',  # 追加
]

これでDjango側にパッケージを読み込ませることはできました。

 

Social Django設定

ここからsocial djangoの設定を行います。

ミドルウェアに追加。

MIDDLEWARE_CLASSES = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

    'social_django.middleware.SocialAuthExceptionMiddleware',  # 追加
]

認証エラー時の例外処理を担当するミドルウェアを追加しました。

 

認証バックエンドに追加。

AUTHENTICATION_BACKENDS = (
    'social_core.backends.open_id.OpenIdAuth',  # OpenId用
    'social_core.backends.google.GoogleOpenId',  # Google OpenId用
    'social_core.backends.google.GoogleOAuth2',  # Google OAuth2用

    'social_core.backends.github.GithubOAuth2',  # Github用
    'social_core.backends.twitter.TwitterOAuth',  # Twitter用
    'social_core.backends.facebook.FacebookOAuth2',  # Facebook用

    'django.contrib.auth.backends.ModelBackend',  # デフォルトバックエンド、必須。
)

認証に使用したいソーシャルメディアを上記の様に追加します。

今回はGoogle OAuth2で認証を設定するので、Google OAuth2用のバックエンドのみ追加でokです。

 

テンプレート設定に以下を追加。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            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',

                'social_django.context_processors.backends',  # 追加
                'social_django.context_processors.login_redirect', # 追加
            ]
        },
    },
]

 

マイグレーション実行。

python3 manage.py migrate

これでsocial django用のテーブルが作成されました。

 

Google認証設定

Google認証に必要なクライアントIDクライントシークレットを作成します。

作成方法は↓やネットの記事を参照

OAuth ウェブ クライアント ID を作成する - Google Workspace Migrate
Google Cloud で、Google Workspace Migrate プラットフォーム用の OAuth ウェブ クライアント ID を作成します。 ウェブ クライアント ID の作成手順 重要: 2022

 

作成したクライアントID、クライアンシークレットをsettings.pyに追加。

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = 'hoge'  # クライアントID
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 'hoge' # クライアント シークレット

 

urlを設定。

from django.conf.urls import include
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views

urlpatterns = [
    path('', views.index, name='index'),  # ログイン後に行いたい処理
    path('login/', views.LoginView, name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
    path('oauth/', include('social_django.urls', namespace='social')),  # Social Django用
]

 

settings.pyにログインURL、認証後のリダイレクト先を設定。

LOGIN_URL = 'login'
LOGIN_REDIRECT_URL = '/'

 

ログイン処理はGoogle認証で行うので、/loginアクセス時にsocial djangoに処理を任せるようにLoginViewを設定します。

from django.http import HttpResponseRedirect

def LoginView(request):
    return HttpResponseRedirect('social:begin', kwargs=dict(backend='google-oauth2'))

def index(request):
    # ログイン後に行いたい処理

social djangoにどの認証を行うか教えてあげる必要があるので、backend引数にgoogle-oauth2を設定します。

 

これで、/loginにアクセスすれば以下の様なGoogle認証が設定されているはずです。

google login

 

簡単にOAuth認証を実現できるのでみなさんも使ってみてください。

メールバリデーションを追加する方法はこちら↓