たけまる / OpenID v1.1 の IdP と Consumer を Catalyst で動かした
2007-12-30
_
OpenID v1.1 の IdP と Consumer を Catalyst で動かした [openid][catalyst]



IdP (Identity Provider) と Consumer を Catalyst で動かしてみました.といっても,IdP はNet::OpenID::Server を Catalyst に組み込むだけだ
し,Consumer にいたっては Catalyst::Plugin::Authentication::Credential::OpenID
というプラグインがあるから簡単だろうと思っていました.ところが,そ
うでもなかったので,メモとソースを残しておきます.
ダウンロードすれば,実際に動く IdP と Consumer が手に入ります.手っ
取り早く手元で OpenID を動かしてみたい人はダウンロードしてみてくだ
さい.なお,Catalyst v5.7011, Catalyst::Plugin::Authentication v0.10004
でテストしました.
OpenID v2.0 仕様がリリースされているのに,v1.1 というのが弱いです
が,Net::OpenID の対応待ちと言うことで.
余談ですが,Catalyst::Plugin::Authentication::Credential::OpenID は
CodeRepos にあげてもいいかもと思いました.id:ikasam_a みたいにが熱
心に見てる人もいるみたいだし.
■ IdP
IdP は URL パラメータの扱いに気をつけたくらいで,すんなり動きました.
基本的には Net::OpenID::Server を組み込むだけで動きます.ただ,
Net::OpenID::Server のドキュメントはかなり不親切だし,Catalyst で動
かす手順を書いたページはなかったので,メモしておくことにしました.
# IdP を商用で立ち上げようという人はほとんどいないと思いますが,手
# 元にあるとテストのときに便利です.
以下のリンクから,IdP として動作する Catalyst アプリケーションをダ
ウンロードできます.
catalyst-idp.tar.gz
ダウンロードしたら,SQLite のデータベースを初期化してください.
$ tar zxvf catalyst-idp.tar.gz $ cd Idp/ $ sqlite3 test.db < init.sql
設定ファイル idp.yaml の server_secret と setup_url を環境に合わせ
て修正してください.
最後に起動します.
$ perl script/idp_server.pl
ユーザごとのページは,http://localhost:3000/user/ 以下になります.
初期状態では,以下の2つのユーザが登録されています.
http://localhost:3000/user/foo@example.com http://localhost:3000/user/bar@example.com
ログインページは http://localhost:3000/login です.ユーザIDとパス
ワードは以下のようになっています.
| foo@example.com | foo |
| bar@example.com | bar |
OpenID のエントリポイント (Consumer がアクセスするURL) は,
http://localhost:3000/server です.
■ Consumer
実際に使える Consumer にしようと,ユーザ情報をデータベース (DBIC)
に格納し,セッションを Cookie に保持することを目標としました.そし
たらかなり苦労しました..結局,Catalyst::Plugin::Authentication::Credential::OpenID v0.03
にもパッチを当てました.
まずは動かし方です.
以下のリンクから,Consumer として動作する Catalyst アプリケーショ
ンをダウンロードできます.
catalyst-consumer.tar.gz
ダウンロードしたら,SQLite のデータベースを初期化して,起動します.
$ tar zxvf catalyst-consumer.tar.gz $ cd Consumer/ $ sqlite3 test.db < init.sql $ perl script/idp_server.pl -p 4000
http://localhost:4000/login にアクセスすると,OpenID を要求されま
す.適当な OpenID (上述の IdP が起動していれば,
http://localhost:3000/user/foo@example.com でもよい) を入力します.
IdP にログイン済みであれば,いきなりログインが完了します.そうでな
ければ,IdP のページに飛ばされます.IdP にログインすれば,Consumer
へのログインも完了します.
Cookie でセッションを保持しているので,他のページに行ってから戻っ
てきても,ログイン状態が保持されています.
SQLite には,新しいユーザの情報が追加されているはずです.
# Net::OpenID::Consumer は,信頼できる IdP を設定できるといいなぁ
■ Catalyst::Plugin::Authentication::Credential::OpenID のパッチ
Consumer のソースに含まれる OpenID.pm には以下のパッチを当てました.
catalyst-openid-0.03.patch
このパッチでは,ユーザが store に存在するかどうかの判定方法と,存在
しなかったときの生成方法を修正しています.この修正が妥当なのかどう
か自信ないのですが,とりあえず動いています.
なお,このパッチは id:ikasam_a のパッチをベースにしています.
OpenID のパッチを書いた - masaki@catalyst - Catalystグループ
ikasam_a いわく,最近 Catalyst の認証に関する内部インタフェースが変
更になったそうです.ikasam_a のパッチはこれに対応するものです.
残念なことに,新しいインタフェースの方では思うように動かすことがで
きなかったので,僕のパッチでは古いインタフェースを使ってたりして中
途半端なのですが..
