🔐

Googleアカウントを使ってDjangoアプリケーションにログインする

2021/12/13に公開約2,200字

使用するライブラリ

https://github.com/python-social-auth/social-app-django

Django以外にも複数のフレームワークに対応。今回は認証プロバイダとしてGoogleを使うが、約60のサービスに対応している。

ドキュメントはこちら。

https://python-social-auth.readthedocs.io/en/latest/index.html

インストール

$ pip install django social-auth-app-django

執筆時点のパッケージバージョンはそれぞれ Django==3.2.10social-auth-app-django==5.0.0 。今回はお試しなのでストレージはデフォルトの SQLite のままで使う。

何はともあれ、まずはプロジェクトを作成する。

$ django-admin startproject auth_social

次に settings.py にアプリケーションを追加する。

INSTALLED_APPS = (
    ...
    'social_django',
    ...
)

migrate コマンドでテーブルを作成する。きちんと設定できていれば social_django 関連のマイグレーションが実行されているのが出力で確認できる。

$ manage.py migrate
  ...
  Applying social_django.0001_initial... OK
  Applying social_django.0002_add_related_name... OK
  Applying social_django.0003_alter_email_max_length... OK
  ...

Djangoの設定

再び settings.py を編集。認証バックエンドの設定を追加する。
今回はGoogleを対象とする。Googleの認証バックエンドは複数あるが、Google OAuth2 バックエンドを使用する。

AUTHENTICATION_BACKENDS = (
    'social_core.backends.google.GoogleOAuth2',
    ...
    'django.contrib.auth.backends.ModelBackend',
)

urls.pyでURLルーティングも設定する。

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('social_django.urls', namespace='social'))
]

/login/google-oauth2/ にアクセスすると、No module named 'jose' というエラーが出たので、インストールしてみる。

https://github.com/mpdavis/python-jose
JWTの署名を作成するときに使ってるっぽい?JWTの仕様がよく分かってないのでこの辺はお勉強が必要。
pip install python-jose[cryptography]

Googleにアプリケーションを登録

改めてURLにアクセスするとGoogleのログインページにリダイレクトされるようになったが、アプリケーション情報がGoogleに登録されていないのでエラーが表示された。

GoogleでクライアントIDを発行して、Django側で設定してやる必要がありそう。Google側での設定はここでは割愛。
settings.py に以下の行を追記して、適切な値を設定してやる。実際に運用するアプリケーションの場合は環境変数あたりから読み込むのが良いだろう。

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = ''
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = ''

以下の画面が表示されるようになった。

ここでGoogleのアカウント情報を使ってログインすると、Djangoアプリケーションの /complete/google-oauth2/ にリダイレクトされた後、さらに /accounts/profile/にリダイレクトされた。
遷移先URLの変更については別途調べよう。

DBを確認すると、auth_userテーブルにユーザが作成されておりsocial_auth_usersocialauthテーブルにはGoogleのトークン情報が格納されていた。

一旦はここまで。

Discussion

ログインするとコメントできます