ziguzagu.org

Authen::TypeKey で TypeKey 認証やってみる

引き続き認証API。今日は TypeKey 認証。

package MyAuth::TypeKey;

use strict;
use warnings;
use base qw(MyAuth);

use CGI::Application::Plugin::Redirect;

use Authen::TypeKey;
use URI;

sub setup {
    my $self = shift;

    $self->start_mode('default');
    $self->run_modes(
        default => 'default',
        verify  => 'verify',
        logout  => 'logout',
    );

    my $api = Authen::TypeKey->new;
    $api->token('xxxxxxxxxxxxxxxxxxxxxxxx');
    $self->stash->{api} = $api;

    $self->stash->{apiname}   = 'Authen::TypeKey';
    $self->stash->{login_uri} = $self->_create_login_uri($api);
}

sub default {
    my $self = shift;
    $self->tt_process('index.tt');
}

sub _create_login_uri {
    my ($self, $api) = @_;

    ## callback uri
    my $cb_uri = URI->new($self->query->url . '/verify');

    return "https://www.typekey.com/t/typekey/login?lang=ja&v=1.1&t=".$api->token."&_return=$cb_uri&need_email=1";
}

sub _process_verify {
    my $self = shift;

    my $api = $self->stash->{api};
    my $res = $api->verify($self->query) or die $api->errstr;

    return {
        name  => $res->{name},
        nick  => $res->{nick},
        email => $res->{email},
        ts    => $res->{ts},
    };
}

1;

親クラスの MyAuth と、テンプレート index.tt は昨日と同じの

Flickr、はてなと違うところは、コールバックURIを認証サーバーじゃなくて、認証リクエストのクエリにつけてしまうところ。

メールアドレスを取得できるところもまた他の認証API とは違う。認証リクエストのクエリーに、need_email パラメーターを0以外の値をくっつくけて渡して、ユーザーの承認が得られれば、認証成功+emailアドレスが取得できる。それ以外の場合はすべて、SHA1で暗号化された値。

TypeKey と直接は関係ないけど、Authen::TypeKey にログインURIを作ってくれる API がないので不便とか。

Flickr、Hatena、TypeKey と認証API眺めたけど、CPANモジュール使っちゃえば使い勝手に大きな差はない感じ。

OpenID は少し様子がちがうっぽい。。。