Django Rest Frameworkでソーシャルログインを実装する
Django Rest Framework(以降DRF)でソーシャルログインを実装したい時の話
色々試したものの上手いこと設定出来ず手こずったのでまとめ
DRFのドキュメントにあるソーシャルログインを試しました.
今回はGithubでテストしました.
環境
- Python 3.7.3
- パッケージ
1$ pip list
2Django 2.2.1
3django-allauth 0.39.1
4django-rest-auth 0.9.5
5djangorestframework 3.9.4
設定
DRFが動くところまでは済んでる前提です.
上記のパッケージのインストール
1$ pip install django-allauth django-rest-auth
settings.pyにインストールしたアプリを追加
1INSTALLED_APPS = (
2 ...,
3 'django.contrib.sites', # 設定してない場合追加しておく
4 'rest_framework',
5 'rest_framework.authtoken',
6 'rest_auth'
7 'allauth',
8 'allauth.account',
9 'allauth.socialaccount',
10 'allauth.socialaccount.providers.github',
11)
12SITE_ID = 1 # 同上
データベースに反映します
1$ python manage.py migrate
Github用の認証ビューを作ります
1class GithubLogin(SocialLoginView):
2 adapter_class = GitHubOAuth2Adapter
3 callback_url = "Githubのアプリ側で設定したコールバックURLと合わせる"
4 client_class = OAuth2Client
適当なURLと紐づけます
1urlpatterns = [
2 url(r'^rest-auth/github/$', GithubLogin.as_view(), name='github_login'),
3]
Djangoの管理画面に入ってSocial appsから新しくGithubを追加します.
名称は小文字で設定します.
その他はGithubで設定した値をコピペします.
今回フロントはないのでGithubのコールバックは適当なURLにしておきました.
https://github.com/login/oauth/authorize?client_id=[作成時のクライアントID]&scope=login
にアクセスするとGithub上でログインし,アクセス許可を出すと設定したコールバックURLに向かって飛ばされます
例)http://localhost:8000/auth/complete/github/?code=01234abcde
この末尾についているcodeを先程設定したビューに投げつけるとソーシャルログイン出来ます.
1$ curl -H 'Content-Type:application/json' -d "{"code":"01234abcde"}" http://localhost:8000/rest-auth/github/
2{
3 "key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
4}