WSSE認証

時間がないのでとりあえず。

RubyによるWSSE認証の実装あたりを参考に、クライアントをつくる。

で、認証はこんなかんじで。(ユーザ名lam パスワードlam)

class Atom::DiaryController < ApplicationController
  before_filter :wsse_authorize

  private

  require 'base64'
  def wsse_authorize
    @@wsse_scanner ||= /^UsernameToken Username="([^"]+)",\sPasswordDigest="([^"]+)",\sNonce="([^"]+)",\sCreated="([^"]+)"$/
    return authorization_require('WSSE認証が必要です') unless request.env['HTTP_X_WSSE']
    return authorization_require('ログインできません') unless @@wsse_scanner =~ request.env['HTTP_X_WSSE']
    
    username = $1
    digest = Base64.decode64($2)
    nonce = Base64.decode64($3)
    created = $4

    return authorization_require('ログインできません') unless username == 'lam' && Digest::SHA1.digest(nonce + created + 'lam') == digest
  
    true
  end

  def authorization_require(message)
    render :status => 401, :layout => false, :text => message

    false
  end
end