C#でWSSE認証する
参照:はてなフォトライフAtomAPIとは - はてなキーワード
サービスによってnonce/digestをbase64エンコードしたりしなかったりするらしい。はてなのはする。
準備する情報
string username="hogehoge"; string password="pass"; DateTime created=DateTime.Now;
Nonce
明確な記述がないんだがたぶん40文字のランダムな英数。
string GenNounce(int length) { StringBuilder sb = new StringBuilder(length); for(int i = 0; i < length; i++) { sb.Append(char.ConvertFromUtf32(s_random.Next(0, 27) + 65)); } return sb.ToString(); }
Didgest
string GenDigest(string pwd, DateTime created, string nonce) { string date_string = created.ToString("s"); byte[] digest_bytes; using(SHA1Managed sha1 = new SHA1Managed()) { digest_bytes = sha1.ComputeHash(System.Text.Encoding.ASCII.GetBytes(nonce + date_string + pwd)); } string didest_b64 = Convert.ToBase64String(digest_bytes); return didest_b64; }
接続
string nonce = GenNounce(40); string nonce_b64 = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(nonce)); string didgest = GenDigest(pwd, created, nonce); HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://b.hatena.ne.jp/atom/feed"); string wsse_header = string.Format( @"UsernameToken Username=""{0}"", PasswordDigest=""{1}"", Nonce=""{2}"", Created=""{3}""", username, didgest, nonce_b64, created.ToString("s")); req.Headers.Add("X-WSSE", wsse_header); req.Method = "GET"; //あとは適当に