Googleアカウントを使ってDjangoアプリケーションにログインする
使用するライブラリ
Django以外にも複数のフレームワークに対応。今回は認証プロバイダとしてGoogleを使うが、約60のサービスに対応している。
ドキュメントはこちら。
インストール
$ pip install django social-auth-app-django
執筆時点のパッケージバージョンはそれぞれ Django==3.2.10
と social-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'
というエラーが出たので、インストールしてみる。
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