はてなグラフをJavaScriptから更新してみた時にWSSE認証がなかなか通らなかった件

WSSE for JavaScript (@ Víctor R. Ruiz's blog) の注意事項

WSSE for JavaScriptグローバル変数を使ってるので、プログラム本体より先に実行するように配置しなければならない。

ライブラリのつもりでプログラムの最後に WSSE for JavaScript を置いてしまい、グローバル変数が初期化されていないため生成されるヘッダが正しくなくて、HTTP ステータスコード 403 (サーバー拒否) となりぜんぜん認証されなかった。この解決に一晩悩んだ。

なお、検索すればすぐ出てくる「wsse.jsのタイムゾーンの計算がおかしい気がする」と言う記事で喚起している注意点は、getTimezoneOffset() を使って書き直した。

2008-11-16 追記:具体的にはisodatetime()を次のように書き直した。


function isodatetime() {

function two(d) {
return ((d<10) ? "0" : "") + d;
}

var today = new Date();
var year = today.getFullYear();

var month = two(today.getMonth() + 1);
var day = two(today.getDate());
var hour = two(today.getHours());
var minute = two(today.getMinutes());
var second = two(today.getSeconds());

var timezoneSgin = (today.getTimezoneOffset() > 0) ? "-" : "+";
var timezoneAbs = Math.abs(today.getTimezoneOffset());
var timezone
= timezoneSgin
+ two(Math.floor(timezoneAbs / 60))
+ ":"
+ two(timezoneAbs % 60);

return year + "-" + month + "-" + day + "T"
+ hour + ":" + minute + ":" + second + timezone;
}