はじめに
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.py
のINSTALLED_APPS
に'social.apps.django_app.default'
と上記の自作アプリを追加します。 INSTALLED_APPS = (
...
'social.apps.django_app.default',
'your own app name',
...
)
4. AUTHENTICATION_BACKENDSの作成
settings.py
にAUTHENTICATION_BACKENDS
を追加し、上記の自作したBackendを追加します。 AUTHENTICATION_BACKENDS = (
'your own app name.views.CustomOAuth2',
...
'django.contrib.auth.backends.ModelBackend',
)
4. TEMPLATESのcontext_processorsに追加
settings.py
のcontext_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_KEY
とSOCIAL_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 件のコメント :
コメントを投稿