Net::OpenID::Consumer
OpenID のテストで、perl の Net::OpenID::Consumer モジュールを使ってみた。
とりあえずほぼサンプルそのままで試すと、Google、Yahoo、はてな、mixi いずれも OK。
でも、
$claimed_identity->set_extension_args( 'http://openid.net/extensions/sreg/1.1', { required => 'nickname,email', }, ); $claimed_identity->set_extension_args( 'http://openid.net/srv/ax/1.0', { mode => 'fetch_request', 'type.nickname' => 'http://axschema.org/namePerson/friendly', 'type.email' => 'http://axschema.org/contact/email', required => 'nickname,email', }, );
のようにして sreg.nickname を取得しようとすると mixi だけなぜか signature_mismatch になった。email だけだと問題ないんだがなぁ……(mixi ではもともと email は取れないけど)。
色々調べて見たところ、UTF-8文字列が返ってくると失敗しているようだと判明。そういえば、CGI モジュールを使う場合、UTF-8を受ける時におまじないが必用だったなぁ。
ということで、
my $cgi = CGI->new; for my $p ($cgi->param) { my @v = map { decode_utf8($_) } $cgi->param($p); $cgi->param($p, @v); }
のようにデコードしてから Net::OpenID::Consumer->new の args に渡したところ、うまく動くようになったのでした。