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 に渡したところ、うまく動くようになったのでした。