はじめに
Djangoにおいて、下の図のようにGoogle等のサイトからOAuth2で認証を行った後、その認証情報をベースにさらにOAuth2で認証を行う方法を調べました。なお、Djangoは1.9.4をベースにしています。
このような構造にすることで、個人認証をGoogle等の外部サイトに任せることができる上に、ユーザー情報を一元管理できます。
また、本内容のサンプルをGitHubに置きましたので参考にしてください。
② OAuth2 Provider部分について
今回は、②のOAuth2 Provider部分について解説します。※①はこちら
※③は次回以降に解説します。
②は後続のWebアプリケーションサーバーに対してOAuth2認証を提供するProviderとして動作させます。
Djangoで利用できるOAuth2 Providerの有名なライブラリとして、Django OAuth Toolkitが存在するため、本システムでもこのライブラリを利用しました。
Django OAuth Toolkitのインストール
Django OAuth Toolkitには、django-oauth-toolkitとdjango-cors-headersが必要なので、pip install django-oauth-toolkit django-cors-headers
を実行してインストールします。当然、
requirements.txt
も利用できます。。Django OAuth Toolkitの設定
Django OAuth Toolkitにもチュートリアルが存在しますが、地味に手間取ります。また、他のDjangoサーバーからアクセスするためのAPIも作成する必要があります。1. INSTALLED_APPSへ追加
settings.py
のINSTALLED_APPS
に'oauth2_provider'
と'corsheaders'
を追加します。 INSTALLED_APPS = (
...
'oauth2_provider',
'corsheaders',
...
)
2. MIDDLEWARE_CLASSESへ追加
settings.py
のMIDDLEWARE_CLASSES
に'corsheaders.middleware.CorsMiddleware'
と'oauth2_provider.middleware.OAuth2TokenMiddleware'
追加します。 MIDDLEWARE_CLASSES= (
...
'corsheaders.middleware.CorsMiddleware',
'oauth2_provider.middleware.OAuth2TokenMiddleware',
)
3. AUTHENTICATION_BACKENDSの作成
settings.py
のAUTHENTICATION_BACKENDS
に'oauth2_provider.backends.OAuth2Backend'
を追加します。 AUTHENTICATION_BACKENDS = (
'oauth2_provider.backends.OAuth2Backend',
'social.backends.google.GoogleOAuth2',
'social.backends.twitter.TwitterOAuth',
...
'django.contrib.auth.backends.ModelBackend',
)
4. urls.pyへ追加
urls.py
に、'url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')),'
を追加します。
urlpatterns = [
...
url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')),
...
]
5. ユーザー情報出力用のAPIを作成
Django OAuth Toolkitのデフォルト機能にはユーザー情報を提供する機能がないため、出力用のAPIをviews.py
に作成します。そのため、本API用のAppを作成してください。
何をどこまで提供するかは用途によって異なりますが、最低限IDは提供するようにする必要があります。
③部分で説明しますが、IDを提供しない場合、アプリケーション側でエラーが発生します。
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
import json
@login_required
def APIbasicinfoView(request):
return HttpResponse(json.dumps({"id":request.user.pk,"email":request.user.email,"first_name":request.user.first_name}))
また、本関数用のurls.pyも同時に作成してください。
urlpatterns =[
url(r"^basicinfo/$", APIbasicinfoView),
]
6. migrateの実行
最後に、データベースにDjango OAuth Toolkitのテーブルを作成するため、python manage.py migrate
を実行してください。
0 件のコメント :
コメントを投稿