DjangoでOpenID: django-authopenidの設定

karasuyamatengu2009-09-17

アプリケーションを作るさいにユーザ管理が面倒。またユーザにとっても一々サイト毎にユーザ名とパスワードを管理するのも面倒。OpenIDを使うとユーザ認証をgoogleなどの大手に任せられて、作る方も使う方も便利になる。常にスパマーとイタチごっこをして鍛えられているシステムに検証を任せられるってのは大きなメリットだ。django-authopenidを使うと比較的簡単にDjangoのアプリケーションをOpenID化してくれる。

ホームページはこれ。
http://bitbucket.org/benoitc/django-authopenid/
code.googleからbitbucketに移った。

インストール

http://bitbucket.org/benoitc/django-authopenid/wiki/Installation
二三方法があるが、これが簡単:


sudo apt-get install python-setuptools
sudo easy_install -U django-authopenid

settings.py

INSTALLED_APPSに追加:

'django_authopenid',

TEMPLATE_CONTEXT_PROCESSORSにこれを追加:

'django_authopenid.context_processors.authopenid',

とマニュアルに書いてあるが、これ無してもなんか動いている、、、

TEMPLATE_CONTEXT_PROCESSORSはディフォルトのsettings.pyにはない。
自分で設定するがその際にディフォルトの値を含めたものを設定しないといけないようだ。


TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.auth',
'django.core.context_processors.debug',
# これは有効にした方がいいでしょう。
#'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.request',
'django_authopenid.context_processors.authopenid',
)

MIDDLEWARE_CLASSES


MIDDLEWARE_CLASSES = (
...
'django_authopenid.middleware.OpenIDMiddleware',
)

LOGIN_REDIRECT_URL='/account/profile/'

ログインした直後に行く場所。これは「next」というクエリパラメタでオーバラーイドできる。

urls.py


# authopenid
(r'^account/', include('django_authopenid.urls')),
(r'^accounts/', include('django_authopenid.urls')),

以上で設定ファイルの編集は終り。

syncdb

./manage.py syncdb
authopenidのテーブルなどをデータベースに設定。

リソース

authopenidとアプリケーションをインテグレートするにはテンプレート、イメージ、cssなどのリソースが必要になる。ソースかインストールされたパッケージの「example」とうディレクトリからコピーしてくる。 まずexampleのあるところを把握しておく。ソースを展開したのならdjango-authopenid/example/、 インストールしたのなら/usrの下のどこかにある。find /user | grep django_authopenidとでもして探す。以下、django_authopenidのありかをAUTHOPENID_HOMEとする。

アプリケーションディレクトリ構成


~/hoge/
settings.py
manage.py
blog/
...などdjangoアプリファイル

# authopenidからアプリケーションに取り込むリーソス
authopenid/
template/
# アプリケーションのstaticアセットはこのように置いているとする。
# ここにauthopenidのも入れちゃう。
# www/ は / のバーチャルパスにマップする。
www/
js/
css/
images/

テンプレート

テンプレートディレクトリをコピー
cp -r $AUTHOPENID_HOME/example/templates ~/hoge/authopenid/

settings.pyでテンプレートパスにこのディレクトリを追加


TEMPLATE_DIRS = (
# /home/tengu/hoge/authopenid/templates
os.path.join(PROJECT_HOME, 'authopenid/templates'),
)

スタティックファイル(js,css,アイコンなど)をexampleからコピー


cd $AUTHOPENID_HOME/example/static; find . | cpio -pd ~/hoge/www

ページを開くと次のリソースロードしようとする。
これがうまくいくようにバーチャルパスを指定する。


http://localhost:8000/css/base.css
http://localhost:8000/css/openid.css
http://localhost:8000/js/jquery-1.3.2.min.js
http://localhost:8000/js/openid-jquery.js

urls.pyにスタティックリソースのパスを通す:


(r'^(?P(css|js|img|images|html)/.*)$',
'django.views.static.serve',
{'document_root': /home/tengu/hoge/www, 'show_indexes': True}),
# なんかこれが必要だったような。
(r'^media(/images/.*)$',
'django.views.static.serve',
{'document_root': /home/tengu/hoge/www, 'show_indexes': True}),

最後にサイトのログイン・登録リンクを変更

<a href='/accounts/signin/?next=/foo/bar/'>ログイン</a>
とでもする。

テスト

  • 上のリンクをクリック。以下のようなページがでるはず。

  • アカウントを持っているプロバイダのロゴにクリック。googleとする。
  • googleに、サイトhogeが情報ほしがっているけどいいか?と聞かれる。Yesとする。
  • hogeに戻される。最初だと登録となりユーザ名を聞いてこられる。登録ボタンを押すとログインされた状態で/foo/bar/に飛ぶはず。
  • 登録済だとそのまま/foo/bar/に行く。

これで、設定は終り。あとはテンプレートやCSSをカスタマイズすれば出来上がり。

メモ

  • django.contrib.auth.decorators.login_requiredは使えない
  • クエリパラメタ「msg」はsignin.htmlに渡されページに出る。