PythonのDjangoでOpenIDのOPを実装してSSO実現
OpenIDによるSSOを試したのでまとめました
OpenIDの仕様等に関する説明は一切しないので注意!
使ったもの
- python2.7
- django1.8 (多分django1.6以上なら大丈夫だと思います)
- python-openid (pipなりeasy_installでインストール)
- django_openid_provider 0.6 (Document)
- django-openid-auth 0.5
ざっくり説明すると
django_openid_providerはOP用のプラグインで
OpenIDRequestを受けてログイン状態を確認して、OpenIDResponseを返します
djangoの認証バックエンドとしてOpenIDが使えるようになります
今回の構成
それぞれのURLがやっていることはこんな感じ。適宜自分のURLに置き換えてください
あと、OPとRPは別プロジェクトじゃないと動きません。(たぶん)
OP側(django_openid_provider)
/provider/ OpenIDRequestの受け取りとOpenIDResponseの返し
/provider/xrds/ XRDS文書を返します
/provider/decide/ 確認ページを表示
/accounts/login/ 自分で実装する、OPでのログインをする部分。ログイン出来れば何でもいいです
RP側(django-openid-auth)
/consumer/login/ IdentityURLを使ってDiscovery,OpenIDRequestの送信
/consumer/complate/ OpenIDResponseの受け取りとRPでのログイン
/app/ OpenID認証させたいプログラム(なんでもいいです)
準備
両方共リンクからダウンロードしてきて各プロジェクトフォルダに入れた後、
必要な設定をしていきます(INSTALLED_APPSへの追加とルートのurls.pyへの追加は省略)
OP側
settings.py
LOGIN_URL='/accounts/login/'
LOGIN_REDIRECT_URL = '/provider/'
base.htmlをtemplates/openid_providerの中に追加します
blocktagが'content'のものさえ入っていれば良さそう
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>OpenIDSSO</title></head>
<body>{% block content %}
{% endblock %}
</body>
</html>
django1.8で動くようにプラグインのコードを少し修正
views.py(127行目)
#context_instance=RequestContext(request), mimetype=YADIS_CONTENT_TYPE)
context_instance=RequestContext(request), content_type=YADIS_CONTENT_TYPE)
RP側
ファイルを解凍するとREADMEにいろいろ書いてあるのでそこを見て設定します
settings.py
AUTHENTICATION_BACKENDS = (
'django_openid_auth.auth.OpenIDBackend',
'django.contrib.auth.backends.ModelBackend',
)OPENID_CREATE_USERS=True
LOGIN_URL='/consumer/login/'
LOGIN_REDIRECT_URL='/app/'
OPENID_SSO_SERVERL_URL = 'http://localhost:8000/provider/xrds/'
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer' #READMEには書いてないですが、ないとエラーが出ます
同様にコードを修正
view.py(302行目)
#OPENID_LOGO_BASE_64.decode('base64'), mimetype='image/gif'
OPENID_LOGO_BASE_64.decode('base64'), content_type='image/gif'
urls.py(30行目)
#from django.conf.urls.defaults import *
from django.conf.urls import patterns, include, url
templates/openid/login.html(8行目)
background: url({% url openid-logo %}) no-repeat;←この行を削除
以上