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); } }

2012.09.03, 00:22 / Catalyst, OpenID
Catalyst で OpenID を使ってみる はコメントを受け付けていません