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}