最終更新日 2007年10月01日 up top

livedoor Authの使い方

livedoor Authは画期的なサービスである。自分のサービスに人を集めるのも大変だけど、 それ以上に自分のサービスにサインアップさせるのも障壁が高い。 だがlivedoor IDが使えれば、630万アカウント(2007年5月現在)が手中の中なのだ(いや、使ってくれるかは別だけど)。

「え、誰がlivedoorのアカウントなんて持ってるの?」と訝しがる声も同僚から上がったが、 ブログサービスでトップなのはlivedoorなのである。そして大手で認証APIを出してるのもlivedoorなのである(はてなはスルー)。

で。ウェブアプリケーションへの組み込み方法を読んだが全然意味がわからなかった。 実際動くようになるまでに、5日間、延べ8時間くらい費やしてしまった。マジであんな説明じゃわからんて。なのでここで説明する。 例のごとく言語はPHPで、オブジェクト指向な書き方はしない。オブジェクト指向死ね。Javaと一緒に学習机の一番下の奥に隠してあるエロ本と一緒にお母さんに捨てられろ。

動作を見てみる

livedoor auth ログイン

コード

livedoor_auth_config.php


<?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'を指定します。

次にlivedoor AuthではHMAC SHA1を使うのですが、PHP4には関数がないので拾ってきたのを使います。 PHP5であればhash_hmac関数が使えます。

hmacsha1.php


<?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の説明の、
  1. sigを除くすべてのパラメータをアルファベット順にソートする
  2. 1.でソートしたパラメータを <パラメータ名><パラメータの値>の順で全て連結する。
  3. 発行された秘密鍵を利用しHMAC SHA1 (hex)に変換する
  4. 生成された文字列をsigという名前で付加する。
では正直解りませんでした。ので小学生にも解るように書きます。

  1. まず、それぞれのパラメータ名とパラメータ値を単純に連結します。PHPで書けば、例えば 'app_key'.$app_key です。
  2. 次に、連結した文字列をパラメータをアルファベット順にソートし単純連結します。 sigを除くすべてのパラメータをアルファベット順にソートすると「app_key」「perms」「t」「userdata」「v」の順になり、 この順番でさっきの文字列を連結すると言うことは、PHPで書けば、
    
    'app_key' . $app_key . 'perms' . $perms . 't' . $t . 'userdata' . $userdata . 'v' .$v
    
    ということです。
  3. この文字列を秘密鍵を使ってSHA1に変換したものがシグネチャになります。
以下がそのコードです。

livedoor_auth_login.php


<?

// 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の管理画面で登録します。

このコールバックURLのスクリプトで、livedoorからGETで渡されたsigと自前でもう一度計算したsigが一致すれば、 ログインが成功していることになりますが、パラメータ't'にはlivedoorからGETで渡ってきた値(先に渡した値がそのまま返ってくる)と、 新たにパラメータ'token'も加えなくてはいけません。同じくPHPで書けば、

'app_key' . $app_key . 'perms' . $perms . 't' . $_GET['t'] . 'token' . $_GET['token'] . 'userdata' . $userdata . 'v' .$v
となります。perms=userhashの場合はこれで終わりです(ログイン状態だけを得るから)。

livedoor_auth_callback.php


<?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にその値を計算しています。

以上で解説はおしまいです♪