Hatena::Grouprubyist

Rubyで遊ぶよ

 | 

2008-12-01

はてなブックマークのAtomAPIとWsse認証のメモ(2)

15:18

↓の記事の続き。

atomutilで投稿するときだけ成功するのは何故? と思い、atomutil のソースを読んでるところ。

だいたいこんなことをしているらしい。

#!/usr/bin/ruby -Ku
require 'net/http'
require 'digest/sha1'
require 'time'

url = 'http://b.hatena.ne.jp/atom/post'
user = 'USERNAME'
pass = 'PASSWORD'

#WSSEトークン作成
nonce = Array.new(10){rand(0x100000000)}.pack('I*')
nonce_base64 = [nonce].pack('m').chomp
now = Time.now.utc.iso8601
digest = [Digest::SHA1.digest(nonce + now + pass)].pack('m').chomp
token = sprintf(%Q<UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s">,
  user, digest, nonce_base64, now)

#エントリー用Atom作成
data = <<EOF
<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns='http://www.w3.org/2005/Atom'>
  <title>test</title>
  <summary type='text/plain'>[foo][bar]hogehgoe</summary>
  <link href='http://example.com/' rel='related' type='text/html'/>
</entry>
EOF

#POSTリクエストを用意
uri = URI.parse(url)
req = Net::HTTP::Post.new uri.request_uri
req['Accept'] = '*/*'
req['Content-Type'] = 'application/atom+xml;type=entry'
req['Authorization'] = 'WSSE profile="UsernameToken"'
req['X-Wsse'] = token
req.body = data

#送信
Net::HTTP.start(uri.host,uri.port) do |http|
  res = http.request(req)
  res.each do |name,value|
    puts name + ' : ' + value
  end
  puts ''
  puts res.body
end

ポストのヘッダーと中身は atomutil を使って作成したものと同じになっている。(WSSE トークンまで同じではないが、暗号化の関数は同じ)

これを走らせてみたところ、結果は無惨にも失敗。

ヘッダー
vary : Accept-Encoding
x-cache : MISS from squid.hatena.ne.jp
x-squid-error : ERR_ACCESS_DENIED 0
via : 1.0 squid.hatena.ne.jp:80 (squid/2.7.STABLE5)
content-type : text/html
date : Mon, 01 Dec 2008 06:31:18 GMT
x-cache-lookup : NONE from squid.hatena.ne.jp:80
server : squid/2.7.STABLE5
set-cookie : b=ほにゃらら; path=/; expires=Sun, 26-Nov-28 06:31:18 GMT; domain=.hatena.ne.jp
content-length : 1078

内容
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The requested URL could not be retrieved</TITLE>
<STYLE type="text/css"><!--BODY{background-color:#ffffff;font-family:verdana,sans-serif}PRE{font-family:sans-serif}--></STYLE>
</HEAD><BODY>
<H1>ERROR</H1>
<H2>The requested URL could not be retrieved</H2>
<HR noshade size="1px">
<P>
While trying to retrieve the URL:
<A HREF="http://192.168.3.189/atom/post">http://192.168.3.189/atom/post</A>
<P>
The following error was encountered:
<UL>
<LI>
<STRONG>
Access Denied.
</STRONG>
<P>
Access control configuration prevents your request from
being allowed at this time.  Please contact your service provider if
you feel this is incorrect.
</UL>
<P>Your cache administrator is <A HREF="mailto:webmaster">webmaster</A>. 


<BR clear="all">
<HR noshade size="1px">
<ADDRESS>
Generated Mon, 01 Dec 2008 06:16:18 GMT by squid.hatena.ne.jp (squid/2.7.STABLE5)
</ADDRESS>
</BODY></HTML>

192.168.3.189 はローカルの IP アドレスじゃないのか? ping しても通らないけど。

うーん…

リクエストは d.hatena.ne.jp まで通ってないみたい。WSSE の部分を外しても同じ結果。

もしかしたら 192.168.3.189 ははてなのイントラなのかも。

 |