引き続き認証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 は少し様子がちがうっぽい。。。