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に手を入れたら別。