何かWebアプリでも作りたいなーという時にCatalystでがっつり認証処理を作るのは少し面倒。
そこで、Catalystで今流行り(?)のはてな認証を使うためのプラグインを書いてみました。中身はHatena::API::Authを単に使ってみただけ。
→Catalyst::Plugin::Authentication::Credential::HatenaAuth
これを使うとこんな感じに書けるようになります。
use Catalyst qw/Authentication::Credential::HatenaAuth/;
MyApp->config->{authentication}{hatenaauth} = {    
    secret   => 'xxxxxxxxx',
    api_key => 'xxxxxxxxxxxxxxxxxxxx',
};
__PACKAGE__->setup;
sub default : Private {
    my ( $self, $c ) = @_;
    $c->authenticate_hatena;
    $c->res->redirect('/') if $c->req->param('cert');
    if( $c->req->cookies->{hatenaauth} ){
    my %data = $c->req->cookies->{hatenaauth}->value;
        $c->stash->{username}       = $data{name};
        $c->stash->{image_url}       = $data{image_url};
        $c->stash->{thumbnail_url} = $data{thumbnail_url};
    }
}
sub login : Local {
        my ( $self, $c ) = @_;
        $c->res->redirect( $c->config->{hatena_api}->uri_to_login );
}以下、一応使い方。
はてな認証に必要なのは秘密鍵とAPIキーなので、configかYAMLファイルのどちらかに指定しておきます。
# configに書く場合
MyApp->config->{authentication}{hatenaauth} = {    
    secret   => 'xxxxxxxxx',
    api_key => 'xxxxxxxxxxxxxxxxxxxx',
};# myapp.ymlに書く場合
authentication:
    hatenaauth:
        secret:  xxxxxxxxx
        api_key: xxxxxxxxxxxxxxxxxxxxCookieに格納されたデータの受け取りと、はてな認証APIからの認証結果受け取り(コールバックURL)。この例ではトップページで両方やっています。
cert付きのURLで「更新」ボタンを押されるとエラーになるので、はてなの認証結果が来る時(certがあるとき)はリダイレクトしています。
sub default : Private {
    my ( $self, $c ) = @_;
    $c->authenticate_hatena; # これはcallback URLに書く。
    $c->res->redirect('/') if $c->req->param('cert'); # 
    if( $c->req->cookies->{hatenaauth} ){
    my %data = $c->req->cookies->{hatenaauth}->value;
        $c->stash->{username}       = $data{name};
        $c->stash->{image_url}       = $data{image_url};
        $c->stash->{thumbnail_url} = $data{thumbnail_url};
    }
}http://example.com/loginをログインURLとする。
sub login : Local {
        my ( $self, $c ) = @_;
        $c->res->redirect( $c->config->{hatena_api}->uri_to_login );
}後はTTで適当に分岐してあげれば、ログイン済みの場合はユーザ情報を表示し、そうでない場合にはログインURLを表示するということができます。
と、勢いで書いてみましたが果たしてこんなのに意味があるのかどうか・・。外向けのモジュールを書くのは初めてなので見当違いのことをしているのではないかと思えて仕方がありません。なんかすごく汚いような気も(汗)。いきなりCookieにぶち込むというのもどうなのやら。取りあえず自己満足です。ほぼTypeKeyのやつのパクりですし。
何か変なトコなどあればご指摘いただければ幸いです。というか、識者の方こういうの作ってくれないかなぁ。
参考
http://www.tcool.org/catalyst/WritingPlugins.html
http://qootas.org/blog/archives/2005/06/catalyst_authen.html
http://blog.nomadscafe.jp/archives/000540.html
http://blog.nomadscafe.jp/archives/000501.html
http://d.hatena.ne.jp/hyuki/20060424
