AbderaつかってみたけどWSSEでやられる。

最近AtomPubが熱いらしいので、Jakarta Abdera試してみた。
つなぐ先は当然はてブ

WSSE認証にはWSSEAuthSchemeというJakarta CommonsのHttpClient用のAuthSchemeが用意されていて、UserPasswordCredentialと一緒に使うとかいてある。
ということで以下のようにしてみたが、

プロキシのせいとも思ったが違うらしい。プロキシはずしても同じ。

AbderaClient client = new AbderaClient();
WSSEAuthScheme.register(client,true);
client.addCredentials(
"http://f.hatena.ne.jp", null, "WSSE", 
new UsernamePasswordCredentials("user","password"));
		
ClientResponse res = client.get("http://f.hatena.ne.jp/atom");

うまくつながらない。でやり取りを見てみると

> GET http://f.hatena.ne.jp/atom HTTP/1.1
> User-Agent: Jakarta Commons-HttpClient/3.1-rc1
> Host: f.hatena.ne.jp
> Proxy-Connection: Keep-Alive

< HTTP/1.1 401 Authorization Required
< Date: Fri, 30 Nov 2007 12:41:35 GMT
< Server: Apache/2.2.4 (Unix)
< WWW-Authenticate: WSSE profile="UsernameToken"
< Status: 401 X-WSSE authentication required
< X-Framework: Hatena/2.0
< Content-Length: 30
< Content-Type: text/html; charset=iso-8859-1
< Vary: Accept-Encoding

> GET http://f.hatena.ne.jp/atom HTTP/1.1
> User-Agent: Jakarta Commons-HttpClient/3.1-rc1
> Proxy-Connection: Keep-Alive
> X-WSSE: UsernameToken Username="user", PasswordDigest="xxxxxxxxxxxxxxxxx",  Nonce="eq+NMUqEt9z/0yEiXpSulw==", Created="2007-11-30T12:41:11Z"
> Authorization: WSSE profile="UsernameToken"
> Host: f.hatena.ne.jp


< X-WSSE authentication requiredHTTP/1.1 403 Forbidden
< Date: Fri, 30 Nov 2007 12:41:35 GMT
< Server: Apache/2.2.4 (Unix)
< Status: 403 Invalid login
< X-Framework: Hatena/2.0
< Content-Length: 282
< Content-Type: text/html; charset=iso-8859-1
< Vary: Accept-Encoding

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /atom
on this server.</p>
<hr>
<address>Apache/2.2.4 (Unix) Server at 192.168.3.134 Port 80</address>
</body></html>

とこんな感じ。

  • 初回の送信にはX-WSSEヘッダが無い。
  • WWW-Authenticate: WSSE profile="UsernameToken"で認証方法を伝えられる。
  • 2回目は認証方式が伝えられたあとなのでX-WSSEつきで送信
  • invalid login。うむぅ。

ここで生成されたヘッダをこんな感じのソースで実行するとうまくいくので、

 HttpClient ua = new HttpClient();
 String url = "http://b.hatena.ne.jp/atom";
 String wsse = JOptionPane.showInputDialog("Input WSSE Header.");
 GetMethod get = new GetMethod(url);
 get.addRequestHeader("X-WSSE", wsse);
 ua.executeMethod(get);

X-WSSEヘッダが悪いわけではないっぽい。

上のだとProxyにKeep-Aliveしてるけど、直接つないだときも、もちろんコネクションを切るわけではないので、最初からつけておけ、一回目にX-WSSEつけてないともうダメということか?

違いました。User-Agentが悪いだけでした。

なのだが、最初からX-WSSEヘッダをつける術がどうもない。AuthSchemeとかCredentialを使ってという意味でです。

Abderaも内部的にはHttpClientを使っている。HttpClientで初回からユーザー情報を送るPreemptiveモードがあるのだが、これの中身を見ると、basic認証しかサポートしてない。

ということで、はてなのAtom APIには、Method.addRequestHeader()でRequestOptionsをつかってヘッダを書き換えてアクセスするしかないようだ。せっかくCredentialとかAuthSchemeとかあるのに。

というメモ。もちろんHttpClientに手を入れたら別。