WebService Security Enforcement を IAuthenticationModule で実装してみたんだけど
実装してみたんだけど、Hatena のサービスだけ Invalid login でアクセスできない。
軽く調べてみると、g:tech:id:koseki:20050520 にあるように、仕様書の解釈が2通りあるらしく、私が仕様書を見てテキトーに実装したのは type-B だった。Hatena は type-A じゃないと動かないのか? と実装を調整して試してみたら、やっぱり Invalid login で動きません。
色々やってみて、やっと認証がとおったのは、パスワードの文字列を SHA1 に投げるときのエンコードの指定が間違っていた! というオチでした。とりあえずパスワードを UTF-8 でバイト列にすることで認証が通りましたとさ。
たとえば、はてなグラフ数値登録APIを利用して Hatena::Graph に値を追加するメソッドは、こんな感じ
namespace HatenaAPI { public static class Graph { public static bool Update(string graphName, DateTime date, int value) { HttpWebRequest req = WebRequest.Create("http://graph.hatena.ne.jp/api/post") as HttpWebRequest; CredentialCache cache = new CredentialCache(); cache.Add(new Uri("http://graph.hatena.ne.jp/"), "WSSE", new NetworkCredential(username, password)); byte[] buffer = Encoding.UTF8.GetBytes(string.Format( "graphname={0}&date={1:yyyy-MM-dd}&value={2}", HttpUtility.UrlEncode(graphName), date, value)); req.Credentials = cache; req.Method = "post"; req.ContentType = "application/x-www-form-urlencoded"; req.ContentLength = buffer.Length; using (Stream s = req.GetRequestStream()) s.Write(buffer, 0, buffer.Length); using (HttpWebResponse res = req.GetResponse() as HttpWebResponse) return res.StatusCode == HttpStatusCode.Created; } } }
AuthenticationModule を追加しているので、BASIC 認証などとまったく違いはありません。rss を読んで idea:398 を外部から実現するツールぐらいは、すぐつくれそうですね。(認証の問題があるので自分用になりそうですが)
AuthenticationModule そのものは、150 行ぐらいのソースだけど、ここに貼り付けるにはちょっとでかいよね。