livedoor Authは画期的なサービスである。自分のサービスに人を集めるのも大変だけど、
それ以上に自分のサービスにサインアップさせるのも障壁が高い。
だがlivedoor IDが使えれば、630万アカウント(2007年5月現在)が手中の中なのだ(いや、使ってくれるかは別だけど)。
「え、誰がlivedoorのアカウントなんて持ってるの?」と訝しがる声も同僚から上がったが、
ブログサービスでトップなのはlivedoorなのである。そして大手で認証APIを出してるのもlivedoorなのである(はてなはスルー)。
で。ウェブアプリケーションへの組み込み方法を読んだが全然意味がわからなかった。
実際動くようになるまでに、5日間、延べ8時間くらい費やしてしまった。マジであんな説明じゃわからんて。なのでここで説明する。
例のごとく言語はPHPで、オブジェクト指向な書き方はしない。オブジェクト指向死ね。Javaと一緒に学習机の一番下の奥に隠してあるエロ本と一緒にお母さんに捨てられろ。
<?php
// livedoor_auth_config.php
$app_key = '';
$secret = '';
$perms = 'id'; // or 'userhash';
$t = time();
$v = '1.0';
$userdata = '';
$format = 'xml'; // or 'json';
?>
$app_keyにはアプリケーションキー、$secretには暗号用の秘密鍵を設定してください。
$permsには'id'と'userhash'が指定できます。livedoor ID名を知りたい場合は'id'を、
ログイン状態だけで良ければ'userhash'を指定します。$tはURLが生成たれた時刻のエポックタイム、$vはバージョン(現状'1.0'で固定)です。
$userdateにはコールバックURLに渡したい文字列を255バイトまで設定できます。
$formatは後ほど説明しますが、'xml'か'json'を指定します。
<?php
// http://www.php.net/manual/en/function.sha1.php#39492
// Open Publication License
function hmacsha1($key, $data) {
$blocksize=64;
$hashfunc='sha1';
if (strlen($key)>$blocksize)
$key=pack('H*', $hashfunc($key));
$key=str_pad($key,$blocksize,chr(0x00));
$ipad=str_repeat(chr(0x36),$blocksize);
$opad=str_repeat(chr(0x5c),$blocksize);
$hmac = pack(
'H*',$hashfunc(
($key^$opad).pack(
'H*',$hashfunc(
($key^$ipad).$data
)
)
)
);
return bin2hex($hmac);
}
?>
次はlivedoorのログイン画面へのURLを作成します。ここでシグネチャなるものを作らなければいけないのですが、livedoorの説明の、
'app_key' . $app_key . 'perms' . $perms . 't' . $t . 'userdata' . $userdata . 'v' .$v
ということです。
<?
// livedoor_auth_login.php
require('livedoor_auth_config.php');
require('hmacsha1.php');
$sig = hmacsha1( $secret, 'app_key'.$app_key.'perms'.$perms.'t'.$t.'userdata'.$userdata.'v'.$v );
?>
<html>
<body>
<a href="http://auth.livedoor.com/login/?app_key=<?php echo $app_key ?>&perms=<?php echo $perms ?>&t=<?php echo $t ?>&v=<?php echo $v ?>&userdata=<?php echo $userdata ?>&sig=<?php echo $sig ?>">livedoor Auth ログイン</a>
</body>
</html>
このURLはtで指定された時刻から10分で使えなくなるそうです。
このURLにアクセスすると、livedoorのシステムに遷移します。
livedoorにログインしていなければlivedoorのログイン画面が表れ、ログイン後コールバックURLに、
ログインしていればそのままコールバックURLにリダイレクトされます。コールバックURLはlivedoor authの管理画面で登録します。
'app_key' . $app_key . 'perms' . $perms . 't' . $_GET['t'] . 'token' . $_GET['token'] . 'userdata' . $userdata . 'v' .$v
となります。perms=userhashの場合はこれで終わりです(ログイン状態だけを得るから)。
<?php
// livedoor_auth_callback.php
require('livedoor_auth_config.php');
require('hmacsha1.php');
$sig_login = hmacsha1( $secret, 'app_key'.$app_key.'t'.$_GET['t'].'token'.$_GET['token'].'userdata'.$userdata.'userhash'.$userhash.'v'.$v );
$sig_id = hmacsha1( $secret, 'app_key'.$app_key.'format'.$format.'t'.$t.'token'.$_GET['token'].'v'.$v );
?>
<html>
<body>
<?php echo $sig_login ?><br>
<?php echo $_GET['sig'] ?><br>
<table>
<form action="http://auth.livedoor.com/rpc/auth" method="post">
<tr>
<td>app_key</td>
<td><input size=64 type="text" name="app_key" value="<?php echo $app_key ?>"></td>
</tr>
<tr>
<td>format</td>
<td><input size=64 type="text" name="format" value="<?php echo $format ?>"></td>
</tr>
<tr>
<td>t</td>
<td><input size=64 type="text" name="t" value="<?php echo $t ?>"></td>
</tr>
<tr>
<td>token</td>
<td><input size=64 type="text" name="token" value="<?php echo $_GET['token'] ?>"></td>
</tr>
<tr>
<td>v</td>
<td><input size=64 type="text" name="v" value="<?php echo $v ?>"></td>
</tr>
<tr>
<td>sig</td>
<td><input size=64 type="text" name="sig" value="<?php echo $sig_id ?>"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="livedooe ID も得てみる"></td>
</tr>
</form>
</body>
</html>
perms=idの場合は、さらにlivedoor IDを取得することができます。
livedoor IDを取得するには「http://auth.livedoor.com/rpc/auth」に「app_key」「format」「token」「t」「v」パラメータをPOSTで渡します。
ここで'format'には'xml'と'json'を指定することができ、xmlの場合は、
<response>
<error>0</error>
<message>SUCCESS</message>
<user>
<livedoor_id>LivedoorId</livedoor_id>
</user>
</response>
で、'json'の場合は、
{
"error" : 0,
"message" : "SUCCESS",
"user" : {
"livedoor_id" : "LivedoorID"
}
}
みたいな感じでレスポンスが返ってきます。't'と'token'はコールバックURLに返された値を使います。
livedoor_auth_callback.phpでは$sig_idにその値を計算しています。