DjangoでOAuth2認証②

はじめに

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.pyINSTALLED_APPS'oauth2_provider''corsheaders'を追加します。

 INSTALLED_APPS = (
    ...
    'oauth2_provider',
    'corsheaders',
    ...
 )

2. MIDDLEWARE_CLASSESへ追加

settings.pyMIDDLEWARE_CLASSES'corsheaders.middleware.CorsMiddleware''oauth2_provider.middleware.OAuth2TokenMiddleware'追加します。

 MIDDLEWARE_CLASSES= (
    ...
    'corsheaders.middleware.CorsMiddleware',
    'oauth2_provider.middleware.OAuth2TokenMiddleware',
 )

3. AUTHENTICATION_BACKENDSの作成

settings.pyAUTHENTICATION_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 件のコメント :

コメントを投稿