日々の生活メモ帳

調べたことをたまーにつぶやきます コメント、指摘大歓迎

PythonのDjangoでOpenIDのOPを実装してSSO実現

OpenIDによるSSOを試したのでまとめました

OpenIDの仕様等に関する説明は一切しないので注意!

使ったもの

 ざっくり説明すると

django_openid_providerはOP用のプラグイン

OpenIDRequestを受けてログイン状態を確認して、OpenIDResponseを返します

django-openid-authはRP用のプラグイン

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;←この行を削除

以上