はじめに
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 件のコメント :
コメントを投稿