いくつかハマったのでアウトプット。
var
s: TStringStream;
wsse: string;
nonce: string;
created: string;
passwordDigest: string;
const
password = '123456789';
user = 'username';
begin
s := TStringStream.Create('');
try
{WSSE認証用の文字列を作る}
//created
created := DateTimeToIso8601(Now);
//nonce
nonce := HashSHA1(created + IntToHex(Random($FFFFFFFF), 8));
//passwordDigest
passwordDigest := HashSHA1(nonce + created + password);
//wsse
wsse := Format('X-WSSE: UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"',
[user, EncodeBase64(passwordDigest), EncodeBase64(nonce), created]);
{リクエストする}
HTTP.Request.ExtraHeaders.Add(wsse);
HTTP.Get('http://b.hatena.ne.jp/atom', s);
//Memo1.Lines.Text := s.DataString; //煮るなり焼くなり
finally
s.Free;
end;
end;
この例では、HTTP は Indy。
ハマったのは、二点。
一つは、ハッシュを16進数表記にしてから使ってしまった。こんな感じ。3C748979...
実際には、Chr($3C) + Chr($74) + Chr(89) + Chr($79)... に相当する文字列を渡す。
二つ目は、ヘッダに記述する nonce を EncodeBase64 していなかった。(参考: http://d.hatena.ne.jp/molih/20050512/p1)

コメントする