■Net::OpenID::Consumer::Lite を書いてみた
http://svn.coderepos.org/share/lang/perl/Net-OpenID-Consumer-Lite/trunk/
Perl で OpenID を利用する場合、Net::OpenID::Consumer というモジュールがあって、これをつかえば簡単に OpenID のクライアントを実装できて便利。
Net::OpenID::Consumer は Crypt::DH に依存している。この Crypt::DH というのが曲者で、これは Diffie-Hellman 秘密鍵交換というのをやるのにつかっているモジュールなのだが、この計算には多倍長整数演算が必要で、そのために Math::BigInt::GMP/Math::BigInt::Pari あたりが必要。これらのモジュールはもちろん XS でその上外部ライブラリに依存しており、インストールが結構めんどう。しかもこれらのモジュールを先にインストールしておかないと Math::BigInt の pure perl 版をつかってしまうため死ぬほど遅くてサーバが軽く死ぬ(某社では本番のサーバにだけ GMP がはいってなくてくそ重くなったという報告があります)。Crypt::DH 自体の高速化としてCrypt::DH::GMP というモジュールがあってこれはすばらしいハックです。
などと、おもっていたんですが、
- SSL に対応してない認証サーバなんて、つかわない方がいい
- → SSL 前提で
- OpenID 2.0 前提で
- check_authentication 前提で
- XRDS の detect とか無駄じゃない?
といったところで、良質な OpenID の認証サーバだけを対象にした、軽量な OpenID のクライアントライブラリを書いてみた。
依存が LWP と URI にしかないので、CGI とかでも簡単につかえるし、一般的なサービスでも導入しやすくて便利だとおもいます。
使い方は下記のような感じで。
use Net::OpenID::Consumer::Lite;
my $check_url = Net::OpenID::Consumer::Lite->check_url(
'https://mixi.jp/openid_server.pl', # OpenID Server URL
'http://example.com/back_to_here' # かえってくる URL
);
Net::OpenID::Consumer::Lite->handle_server_response($request,
not_openid => sub {
die "Not an OpenID message";
},
setup_required => sub {
my $setup_url = shift;
# Redirect the user to $setup_url
},
cancelled => sub {
# Do something appropriate when the user hits "cancel" at the OP
},
verified => sub {
my $vident = shift;
# Do something with the VerifiedIdentity object $vident
},
error => sub {
my $err = shift;
die($err);
},
);
実際のところ、自分は OpenID についてはそんなに詳しいわけではないので、識者のレビューを求む。具体的にいうと id:zigorou さんとか id:zigorou さんとか id:zigorou さんとか。
【追記】
id:ZIGOROu さんからレビューいただきました。
http://d.hatena.ne.jp/ZIGOROu/20081201/1228102667
id:miyagawa さんからもご指摘いただきましたが、このモジュールは 「mixi認証と livedoor 認証を同じプロトコル/ライブラリで扱える」ということが主眼です。
identification の用途では使えませんし、いくつかの重要な機能をそぎおとしてあります。また、フルスペックのライブラリが必要ならすでにフルスペックのライブラリがあるので、そちらをご利用ください。
このモジュールは、OpenID を利用し、限定した OP を対象として、簡易的な認証を行うものです。OpenID の機能をフルに使うことはできません。


