Ruby はてなブックマーク Atom API WSSE認証

はてなブックマークAtomAPI/はてなフォトライフAtomAPI で使用するWSSE認証のHTTP X-WSSEヘッダを作成するRubyスクリプト

$KCODE = 'u'

require 'time'
require 'digest/sha1'

def hatena_wsse_header(hatena_id, password)
  # Nonce : HTTPリクエスト毎に生成したセキュリティ・トークン
  # ランダムなバイト列 http://sheepman.parfait.ne.jp/20050104.html
  nonce = Array.new(10){ rand(0x100000000) }.pack('I*')
  nonce_base64 = [nonce].pack("m").chomp # Base64エンコード

  # Created : Nonceが作成された日時をISO-8601表記で記述したもの
  now = Time.now.utc.iso8601

  # PasswordDigest : Nonce, Created, パスワードを文字列連結しSHA1アルゴリズムでダイジェスト化して生成された文字列を、Base64エンコードした文字列
  digest = [Digest::SHA1.digest(nonce + now + password)].pack("m").chomp

  credentials = sprintf(%Q<UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s">,
                        hatena_id, digest, nonce_base64, now)
  { 'X-WSSE' => credentials }
end