prettify-print

2010年6月29日火曜日

WSSE認証について

どういうものか。というのがよくわからないので、調べてみる。以下ははてなフォトライフAtomAPI方式であり、PasswordDigestをどうするとかどうのこうのについて実装により差があるらしい・・・。

認証方法
  • 通信方法はHTTP(S)である
  • X-WSSEヘッダを利用する
  • 必要なパラメータは4種あり、そのうちパスワードはSHA1でハッシュを求める形をとる
X-WSSEヘッダ
  • X-WSSE: UsernameToken Username="hoge", PasswordDigest="K2tGOqR2Ow1CnFX++bb06CMy+rQ=", Nonce="YUc5blpRPT0=", Created="2010-06-28T16:56:10+09:00"
ヘッダの要素について
  • Username : ユーザ名
  • PasswordDigest : パスワード + Nonce + Created を連結しSHA1でハッシュ化、その後base64encodeをおこなう
  • Nonce : リクエスト毎に作成したトークン
  • Created : Nonceが作成された日時をISO-8601形式にしたもの
クライアント側実装例(PHP)
$url = "http://testurl/test.php";
$user_name = "hoge";
$password = "hoge";
$nonce = "YUc5blpRPT0=";
$created_time = date('c');

$digest = sha1($password . $nonce . $created_time);
$wsse_header = sprintf('X-WSSE: UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"', $user_name, $digest, $nonce, $created_time);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
array('Content-Type: text/plain; charset=UTF-8',
$wsse_header));
var_dump(curl_exec($ch));
curl_close($ch);
exit(0);
サーバ側実装例(PHP)
$headers = getallheaders();
header('Content-Type: text/plain; charset=UTF-8');
echo "View Headers\n";
foreach($headers as $k => $v){
echo "Name -> $k : Value -> $v\n";
}
echo "end.\n";
exit(0);


コードの注意点
  • クライアント側でcurl_initとか、curlがらみの関数を利用してるが、PHPで利用する場合にはwith-curlオプションをつけてかつcurlのライブラリを入れておくこと
  • サーバ側でgetallheadersを使っているが、php向けApacheモジュールを使うこと。といっても使わずに動作させることはないだろうけど。
参考


2010年6月26日土曜日