2012.09.03
Catalyst で OpenID を使ってみる
参考にしたサイト
1. Consumerの実装を知り、OpenIDを使ってみよう
2. PerlでYahoo!とmixiのOpenIDを使ってみよう!
1. のサイトの通りにやったら、Error : signature_mismatch: Prior association invalidated ID provider response. というエラーが出たので、2. のサイトを参考にして、new のときのキャッシュ、debug パラメータを消した。
使用するOpenIDのCPANライブラリは、Net::OpenID::Consumer。
cpan> install Net::OpenID::Consumer
で問題なく入る。
OpenID の処理へ飛ばすための場所と、結果が返ってくる場所の2つが必要。
前者が http://localhost:3000/openid, 後者が http://localhost:3000/openid/helper としてある。
http://localhost:3000/openid?openid_url=https://mixi.jp というURLをたたくと、OpenID の認証が始まる。
OpenID の処理へ飛ばすための場所(http://localhost:3000/openid)
use LWP::UserAgent; use Net::OpenID::Consumer; sub index : Private { my ( $self, $c ) = @_; my $csr = Net::OpenID::Consumer->new( ua => LWP::UserAgent->new, consumer_secret => 'hogehoge', args => $c->req->params, ); if (my $cident = $csr->claimed_identity($c->req->params->{openid_url})) { $cident->set_extension_args('http://openid.net/srv/ax/1.0', { mode => 'fetch_request', 'type.nickname' => 'http://axschema.org/namePerson/friendly', required => 'nickname', }); my $check_url = $cident->check_url( return_to => "http://localhost:3000/openid/helper", trust_root => "http://localhost:3000/", ); $c->res->redirect($check_url); } else { $c->res->body("Can't create claimed identifier object."); } $c->stash->{template} = "openid.t"; $c->forward('Hello::View::TT'); }
結果が返ってくる場所(http://localhost:3000/openid/helper)
use LWP::UserAgent; use Net::OpenID::Consumer; sub index : Private { my ( $self, $c ) = @_; my $csr = Net::OpenID::Consumer->new( ua => LWP::UserAgent->new, consumer_secret => 'hogehoge', args => $c->req->params, ); if (my $setup_url = $csr->user_setup_url) { $c->res->redirect($setup_url); } elsif (my $vident = $csr->verified_identity) { # ここで処理する my $ax = $vident->signed_extension_fields('http://openid.net/srv/ax/1.0'); # ニックネームを取得する my $nickname = $c->req->params->{'openid.ax.value.nickname'}; if(!($nickname)){$nickname = "匿名";} # ProfileのURLを取得する my $profile = $c->req->params->{'openid.identity'}; $c->res->body("" . $nickname . "さんがログインしました。
"); } elsif ($csr->user_cancel) { $c->res->body('Cancel'); } else { Catalyst::Exception->throw('Error : ' . $csr->err); } }