May 21, 2006

Catalystではてな認証APIを使うプラグイン

何か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: xxxxxxxxxxxxxxxxxxxx

Cookieに格納されたデータの受け取りと、はてな認証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のやつのパクりですし。

何か変なトコなどあればご指摘いただければ幸いです。というか、識者の方こういうの作ってくれないかなぁ。

5/29 CPANにありました。探したつもりですっかり忘れていたようです。更にこちらの作者の方よりご指摘を頂いていました。これではいろいろとまずいようです。取りあえず消しましたorz。

参考
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



この記事へのトラックバックURL

http://app.blog.livedoor.jp/cpiblog00035/tb.cgi/50460153
この記事へのコメント
「TypeKeyのやつ」を開いたら英語でビックリしました('∇')
あいかわらずサッパリわからないです・・・orz
Posted by Taeco at May 22, 2006 21:54