ふとAtomPPで認証に用いられるWSSE Username Tokenを喋ってみたくなり試してみた。
その一部始終は下記である。

話相手となったのは、AtomPPを提供しているlivedoor Blogです。
また大丈夫だとは思ったのですが念の為Username、PasswordDigestの部分に関しては仮の物に書換えてあります。

% telnet cms.blog.livedoor.com 80
Trying 203.131.198.212...
Connected to cms.blog.livedoor.com.
Escape character is '^]'.
GET /atom HTTP/1.0
X-WSSE: UsernameToken Username="clouder", PasswordDigest="NU0ydnNkNHhsc0ZGc3VydGs1MWRSRWR1bDlF", Nonce="TXlOb25jZQ==", Created="2005-10-10T10:10:10"


上記がリクエストになります。「GET /atom HTTP/1.0」のあとに、X-WSSEヘッダでごにょごにょと値を渡しています。
Usernameは自分のユーザ名、PasswordDigestはその後に続くNonceとCreatedと実際のパスワードをつなげたものをSHA1で変換した値をBase64エンコードした値になります。それをperlで求めるには下記のようにやります。

% perl -MDigest::SHA1 -e 'warn Digest::SHA1::sha1_base64("MyNonce2005-10-10T10:10:10password")'
5M2vsd4xlsFFsurtk51dREdul9E

この結果の最後に"="を付けた「5M2vsd4xlsFFsurtk51dREdul9E=」がPasswordDigestになります。Nonceは、PasswordDigestを生成するときに使った「MyNonce」という値をBase64した値になります。perlで求めるには、下記のようにやります。

% perl -MMIME::Base64 -e 'warn MIME::Base64::encode_base64("MyNonce")'
TXlOb25jZQ==

Createdは単純に今の日時です。

上記のリクエストを送ると下記のようなレスポンスが返ってきました。

HTTP/1.1 200 OK
Date: Thu, 13 Oct 2005 18:11:44 GMT
Server: Apache/1.3.33 (Unix) mod_perl/1.29
P3P: CP="BUS OUR PHY STP ADM CUR DEV PSA PSD"
Content-Type: application/x.atom+xml
X-Cache: MISS from cms.blog.livedoor.com
Connection: close

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://purl.org/atom/ns#">
  <link xmlns="http://purl.org/atom/ns#" type="application/x.atom+xml" rel="service.post" href="http://cms.blog.livedoor.com/atom/blog_id=000000" title="Clouder::Tester"/>
  <link xmlns="http://purl.org/atom/ns#" type="application/x.atom+xml" rel="service.feed" href="http://cms.blog.livedoor.com/atom/blog_id=000000" title="Clouder::Tester"/>
  <link xmlns="http://purl.org/atom/ns#" type="application/x.atom+xml" rel="service.categories" href="http://cms.blog.livedoor.com/atom/blog_id=000000/svc=categories" title="Clouder::Tester" />
  <link xmlns="http://purl.org/atom/ns#" type="application/x.atom+xml" rel="service.upload" href="http://cms.blog.livedoor.com/atom/blog_id=000000/svc=upload" title="Clouder::Tester" />
</feed>
Connection closed by foreign host.

おぉ、livedoor BlogのAtomPPはuploadやcategoriesもサポートしているみたいですね。
なぜ突然こんなことしたくなったかと言うと、下記の本を読んでいたからです。これは今までネットでちらばっていたWebサービスAPIの情報が1つにまとまってて、いいかんじですね。

最新WebサービスAPIエクスプロ-ラ ~Amazon、はてな、Google、Yahoo! 4大Webサービス完全攻略
Software Design 編集部
技術評論社 (2005/09/23)
売り上げランキング: 6,326