Declaration
std::string wsse(const std::string& id, const std::string& password); std::string wsse(const char* id, const char* password);
Overview
wsse 関数は,WSSE 認証のためのヘッダ文字列を生成します. 生成する文字列の書式は以下の通りです(ただし,改行コードは挿入されません).
UserToken Username="id", PasswordDigest="digest", Nonce="nonce", Created="date"
nonce は 20Byte のランダムなデータを Base64 encode した文字列, date はヘッダ文字列を作成した UTC 時刻を ISO 8601 形式で表記した文字列となります.digest は,nonce,date, password を文字列連結したものを SHA-1 方式でハッシュ値を計算し, その結果を Base64 encode した文字列になります.
Example
#include <iostream> #include "clx/http.h" #include "clx/uri.h" #include "clx/wsse.h" int main(int argc, char* argv[]) { if (argc < 5) { std::cerr << "usage " << argv[0] << " domain path user_id password" << std::endl; std::exit(-1); } try { clx::http session(clx::uri::encode(argv[1])); std::map<std::string, std::string> heads; heads["X-WSSE"] = clx::wsse(argv[3], argv[4]); session.get(clx::uri::encode(argv[2]), heads); std::cout << "code: " << session.code() << std::endl; std::cout << std::endl; std::cout << "head" << std::endl; std::cout << "--" << std::endl; for (clx::http::head_iterator pos = session.head().begin(); pos != session.head().end(); pos++) { std::cout << pos->first << ": " << pos->second << std::endl; } std::cout << std::endl; std::cout << "body" << std::endl; std::cout << "--" << std::endl; std::cout << session.body() << std::endl; } catch (clx::socket_error& e) { std::cerr << e.what() << std::endl; std::exit(-1); } return 0; }
Result $ ./test d.hatena.ne.jp "/tt_clown/atom/blog" tt_clown ******** code: 200 head -- Content-Length: 200816 Content-Type: application/atom+xml;charset=type=feed Date: Tue, 02 Sep 2008 12:43:14 GMT Server: Apache/2.2.3 (CentOS) Set-Cookie: b=$1$bCahvuZe$i9MYHfdOyiwfPDxL/rBsI1; path=/; expires=Mon, 28-Aug-28 12:43:14 GMT; domain=.hatena.ne.jp Vary: Accept-Encoding body -- <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <updated>2008-08-30T00:00:00+09:00</updated> <id>tag:d.hatena.ne.jp,2008:diary-tt_clown</id> <title>Life like a clown</title> ・・・(以下略)・・・