Hatena::Groupsubtech

#生存戦略 、それは

-> 06 { 04 / 24 }

Hatena::API::Auth

21:39 | はてなブックマーク -  Hatena::API::Auth - #生存戦略 、それは

ruby 版作った、けど rubyforge の申請がまだとおんねぇー。実家鯖も落ちててサンプルおけねー。

追記

http://rubyforge.org/projects/hatenaapiauth/

 gem install hatenaapiauth

で。

とりあえずソース

require 'open-uri'
require 'uri'

begin
  require 'md5'
rescue LoadError
end

begin
  require 'json'
rescue LoadError
  require 'rubygems'
  require 'json'
end

module Hatena
  module API
    class AuthError < RuntimeError;end
    class Auth
      BASE_URI = 'http://auth.hatena.ne.jp/'
      PATH = {
        :auth => '/auth',
        :json => '/api/auth.json'
      }.freeze
      VERION = '0.1.0'

      attr_accessor :api_key, :secret
      def initialize(options = {})
        @api_key = options[:api_key]
        @secret  = options[:secret]
      end

      def uri_to_login
        uri = URI.parse BASE_URI
        uri.path = PATH[:auth]
        uri.query = query_with_api_sig
        uri
      end

      def login(cert)
        result = JSON.parse open(
                   uri_to_authcheck(cert),
                   'User-Agent' => "#{self.class}/#{VERION} - Ruby"
                 ).read

        if result['has_error']
          raise AuthError.new(result['error']['message'])
        else
          result['user']
        end
      end

      private
      def api_sig(hash)
        Digest::MD5.hexdigest(@secret + hash.to_a.map.sort_by {|i| i.first.to_s}.join)
      end

      def uri_to_authcheck(cert)
        uri = URI.parse BASE_URI
        uri.path = PATH[:json]
        uri.query = query_with_api_sig(:cert => cert)
        uri
      end

      def query_with_api_sig(request = {})
        query = request.update(:api_key => @api_key)
        query[:api_sig] = api_sig(query)
        query.map {|i| i.join '=' }.join('&')
      end
    end
  end
end

babiebabie2006/04/24 14:51ん。最初それ(Hash,map,join)で書いてたけど、フォーカスが逸れるなと思って。

secondlifesecondlife2006/04/24 14:55確かに kogainaize 風になっちゃいますよね。
わかりやすさ優先なら babie さんのコードかなぁ。
でもわかりやすさ優先だと rexml わかりにくすg(ry

babiebabie2006/04/24 16:05あ、でも URI::HTTP#query= は知らんかった。thx。
いやいや rexml は(ry

donayamadonayama2006/04/24 22:41くだらんtypo指摘ですいませんが、VERION = '0.1.0'になっております…。

secondlifesecondlife2006/04/24 23:08oh, 本当だ。
リリースには直します。thx!

tokuhiromtokuhirom2006/04/25 00:21sandwitch ってなんのときでしたっけか?テラナツカシス

secondlifesecondlife2006/04/25 00:29勝手に tokuhirom のコードをリファクタリング!
コーナーかなんかで使われたコードにあったメソッド名ですね。
mixi かなんかでやったんだっけか。

babiebabie2006/04/25 01:41いつもは return も明示するんだけど、なんかダルくなっちゃって>括弧
mixi かなんかで表出力を作るネタだったような>sandwich

secondlifesecondlife2006/04/25 09:56return は必要時以外書かないなぁ。

トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20060424