DjangoでOAuth2認証③

はじめに

Djangoにおいて、下の図のようにGoogle等のサイトからOAuth2で認証を行った後、その認証情報をベースにさらにOAuth2で認証を行う方法を調べました。
なお、Djangoは1.9.4をベースにしています。

このような構造にすることで、個人認証をGoogle等の外部サイトに任せることができる上に、ユーザー情報を一元管理できます。


また、本内容のサンプルをGitHubに置きましたので参考にしてください。

③ OAuth2 Consumer部分について

今回は、③のOAuth2 Consumer部分について解説します。
※①はこちら
※②はこちら

③は②で作成したProviderに接続し、認証を受けます。
ここでも①で利用したPython Social Authを利用します。
そのため、インストール等は①と変わりませんが、認証先のProviderが自作サーバーであるため、Backendを自作する必要があります。

1. Python Social Authのインストール

pip install python-social-authを実行するだけでインストールが完了します。
requirements.txtを利用する等、お好きな形でインストールしてください。

2. 自作Provider用のアプリ作成

views.pyかmodels.pyに以下を記載します。
URLのexampleは適宜読み替えてください。

 import urllib2
 import json

 from social.backends.oauth import BaseOAuth2

 class CustomOAuth2(BaseOAuth2):
     name = 'custom'
     AUTHORIZATION_URL = 'https://example/o/authorize/'
     ACCESS_TOKEN_URL = 'https://example/o/token/'
     ACCESS_TOKEN_METHOD = "POST"
     SCOPE_SEPARATOR = ','
     EXTRA_DATA = [
         ('id', 'id'),
     ]

     def get_user_details(self, response):
         """Return user details from account"""
         return {'email': response.get('email') or '',
                 'first_name': response.get('first_name')}

     def user_data(self, access_token, *args, **kwargs):
         url='https://example/api/profiles/basicinfo/'
         headers = { "AUTHORIZATION":'Bearer %s' % access_token}

         req = urllib2.Request(url, headers=headers)
         response = urllib2.urlopen(req)
         jsondata = response.read()
         data=json.loads(jsondata)
         result={"id":data["id"],"email":data["email"],"first_name":data["first_name"]}
         return result

なお、user_data関数で詳細情報や追加情報を取得します。Provider側で追加情報を追加した場合は、その情報をここにも追加してください。

3. INSTALLED_APPSへ追加

settings.pyINSTALLED_APPS'social.apps.django_app.default'と上記の自作アプリを追加します。

 INSTALLED_APPS = (
    ...
    'social.apps.django_app.default',
    'your own app name',
    ...
 )

4. AUTHENTICATION_BACKENDSの作成

settings.pyAUTHENTICATION_BACKENDSを追加し、上記の自作したBackendを追加します。

 AUTHENTICATION_BACKENDS = (
    'your own app name.views.CustomOAuth2',
    ...
    'django.contrib.auth.backends.ModelBackend',
 )

4. TEMPLATESのcontext_processorsに追加

settings.pycontext_processorsに、'social.apps.django_app.context_processors.backends''social.apps.django_app.context_processors.login_redirect'を追加します。

 #Django 1.9
 TEMPLATES = [
    {
        'BACKEND': ...,
        'DIRS': ...,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                ...
                'social.apps.django_app.context_processors.backends',
                'social.apps.django_app.context_processors.login_redirect',
                ...
            ],
        },
    },
 ]

なお、Djangoの古いバージョンではTEMPLATE_CONTEXT_PROCESSORSに追加してください。

 #Older Django
 TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'social.apps.django_app.context_processors.backends',
    'social.apps.django_app.context_processors.login_redirect',
    ...
 )

5. KEYとSECRETを追加

OAuth2ではアプリケーションをOAuth2 Provider側に認証してもらうためのKey(Client ID)とSecretが必要です。
Provider側でKeyとSecretを生成してください。なお、戻すURLは/accounts/complete/custom/になります。※customは始めに作成したクラスのname の値になります。
KeyとSecretを追加する変数名は、SOCIAL_AUTH_CUSTOM_KEYSOCIAL_AUTH_CUSTOM_SECRETです。


 SOCIAL_AUTH_CUSTOM_OAUTH2_KEY = 'KEY'
 SOCIAL_AUTH_CUSTOM_OAUTH2_SECRET = 'SECRET'

6. urls.pyに追加

urls.pyに、'url(r'^accounts/', include('social.apps.django_app.urls', namespace='social')),'を追加します。

 
 urlpatterns = [
    ...
    url(r'^accounts/', include('social.apps.django_app.urls', namespace='social')),
    ...
 ]

7. migrateの実行

最後に、データベースにPython Social Authのテーブルを作成するため、python manage.py migrateを実行してください。

0 件のコメント :

コメントを投稿