ブログ  前の記事  次の記事  2007-12-30 

たけまる / 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 のパッチはこれに対応するものです.

残念なことに,新しいインタフェースの方では思うように動かすことがで
きなかったので,僕のパッチでは古いインタフェースを使ってたりして中
途半端なのですが..

一言メッセージをこっそり送信できます (非公開)
 今年の西暦→
Referrer (Inside): [2008-01-04-1]