Django で Google OAuth2 ソーシャルログインを実装する

シェアする

Django で Google OAuth2 ソーシャルログインを実装します。Google アカウントでログインする、よく見るやつですね。

実装する方法は、いろいろありますが、今回は、様々なソーシャルログインをサポートしている、social-app-django という Python パッケージを使って実装したいと思います。

完成イメージ

環境とバージョン

  • Python 3.6.4
  • Django 2.0.3
  • Python Social Auth – Django 2.1.0

インストール

Python

$ sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm $ sudo yum install -y python36u python36u-libs python36u-devel python36u-pip

Python は IUS リポジトリの Python 3.6 をインストールします。CentOS 7 で Python3 を使う別の方法としては SCL もありますが、コマンドやパスが複雑になるので、私は、IUS リポジトリの Python を使います。

あと、SCL は、PyCharm のリモートデバッグ機能が使えなかったんです。(私がうまく設定できないだけかも)

Django

$ sudo pip install django

Django をインストールします。

Python Social Auth – Django

今回の主役、Python Social Auth – Django をインストールします。

実装

プロジェクトとアプリケーションの作成

$ django-admin startproject social_auth
$ cd social_auth
$ python3.6 manage.py startapp login
$ python3.6 manage.py startapp account

Django プロジェクト雛形をおきまりのコマンドで生成します。

settings.py

...
ALLOWD_HOSTS = ['*']
INSTALLED_APPS = [
    ...
    'login.apps.LoginConfig',
    'account.apps.AccountConfig',
    'social_django',
]
...
TEMPLATES = [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                ...
                'social_django.context_processors.backends',
                'social_django.context_processors.login_redirect',
            ],
        }
    }
]
...
LOGIN_REDIRECT_URL = '/account/'
AUTHENTICATION_BACKENDS = [
    'social_core.backends.open_id.OpenIdAuth',
    'social_core.backends.google.GoogleOpenId',
    'social_core.backends.google.GoogleOAuth2',
    'social_core.backends.google.GoogleOAuth',
    'social_core.backends.twitter.TwitterOAuth',
    'social_core.backends.yahoo.YahooOpenId',
    'django.contrib.auth.backends.ModelBackend',
]
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = 'Your Client ID'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 'Your Secret'

settings.py です。

外部のどこからアクセスできるよう、ALLOWED_HOSTS に ‘*’ を設定します。

INSTALLED_APPS は、ログインページ用と、Google から戻ってくる用ページの二つのアプリケーションと、social_django を追加します。

AUTHENTICATION_BACKENDS は、リファレンスのまま実装しています。Google OAuth2 だけで動作するかは未確認です。

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY と SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET は、後述する Google Could Platform で取得する値を実装します。

urls.py

from django.urls import path, include
from django.views.generic import TemplateView
urlpatterns = [
    path('login/', TemplateView.as_view(template_name='login/login.html')),
    path('account/', TemplateView.as_view(template_name='account/account.html')),
    path('social/', include('social_django.urls', namespace='social'))
]

urls.py は settings.py の INSTALLED_APPS と同様に、ログインページ用と、Google から戻ってくる用ページと social_django を実装します。

login.html(ログインページ)

<html>
  <head>
    <title>Django Google Auth</title>
  </head>
  <body>
    <h1>Django Google Auth</h1>
    <a href="{% url 'social:begin' 'google-oauth2' %}">Login with Google</a>
  </body>
</html>

ログインページ HTML です。シンプルに Google ログインへのリンクだけを実装しています。

account.html(Google ログインから戻ってくる用)

<html>
  <head>
    <title>Django Google Auth</title>
  </head>
  <body>
    <h1>Django Google Auth</h1>
    <table>
      <thead>
        <tr>
          <th>Username</th>
          <th>First Name</th>
          <th>Last Name</th>
          <th>E-mail</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>{{ request.user.username }}</td>
          <td>{{ request.user.first_name }}</td>
          <td>{{ request.user.last_name }}</td>
          <td>{{ request.user.email }}</td>
        </tr>
      </tbody>
    </table>
  </body>
</html>

Google ログインから戻ってくる用のページです。ログインに成功すれば、Google アカウントからユーザー名やメールアドレスを表示するようにしています。

tree コマンドでファイル構成を確認

$ tree
.
├── account
│   ├── __init__.py
│   ├── apps.py
│   └── templates
│       └── account
│           └── account.html
├── login
│   ├── __init__.py
│   ├── apps.py
│   └── templates
│       └── login
│           └── login.html
├── manage.py
└── sorial_auth
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

7 directories, 11 files

不要なファイルを削除し、最終的なファイル構成はこのようになりました。

Google Could Platform の設定

API とサービス

認証情報

OAuth 2.0 クライアント ID をウェブアプリケーションで作成し、承認済みリダイレクト URI に以下をセットします。

http://localhost:8000/social/complete/google-oauth2/

OAuth 同意画面

Google OAuth 同意画面を用意します。今回はテストなので、設定したのは、サービス名だけです。

Google+ API

Google+ API を有効にします。

VirtualBox の設定

ポートフォワーディング

  • 名前: http
  • プロトコル: TCP
  • ホスト IP: 127.0.0.1
  • ホストポート: 8000
  • ゲスト IP: 何も入力しない
  • ゲストポート: 8000

いつもはこの設定をしないのですが、今回、Google Cloud Platform のリダイレクト設定で、IP アドレスを設定することができませんでしたので、VirtualBox のポートフォワーディングを設定し、ホスト(Mac)へのアクセスをゲストVM (CentOS) に転送しています。

動作確認

DB migrate

$ python3.6 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, social_django
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK
  Applying social_django.0001_initial... OK
  Applying social_django.0002_add_related_name... OK
  Applying social_django.0003_alter_email_max_length... OK
  Applying social_django.0004_auto_20160423_0400... OK
  Applying social_django.0005_auto_20160727_2333... OK
  Applying social_django.0006_partial... OK
  Applying social_django.0007_code_timestamp... OK
  Applying social_django.0008_partial_timestamp... OK

動作確認するために、DB の設定をします。今回はテストなので、デフォルトの SQLite を使用しています。

runserver

$ python3.6 runserver 0.0.0.0:8000

Django デバッグサーバーの runserver を起動します。

http://localhost:8000/login/

ブラウザから http://localhost:8000/login/ にアクセスし、Google ログインの動作を確認します。Google ログインが成功すると、Django の認証処理が実行され、Google アカウントのユーザ名やメールアドレスを確認することができると思います。

まとめ

Django で Google OAuth2 ソーシャルログインを実装しました。今回初めて実装しましたが、思ったよりも簡単に実装できました。これをベースに Facebook や Twitter などのソーシャルログインも実装していきたいと思います。