Ruby で OAuth を使ってみた (3)
RubyのOAuthライブラリが動くようになったので、Twitterへの接続用ライブラリ OAuth::Twitter を作ってみた。
使い方はこんな感じ。
require 'oauth/twitter' # consumer_keyとconsumer_secretはTwitterのページで事前に取得 tw = OAuth::Twitter.new(consumer_key, consumer_secret) # リクエストトークンを取得 req_token = tw.request_token # このURI (twitterの認証(認可?)ページ) へユーザをリダイレクトさせる uri = tw.authorize_url(req_token) # 以下はユーザの認可後に実施する。認可前にやると403 Forbiddenになる。 access_token = tw.access_token(req_token)
これでTwitter APIにアクセスするためのトークンが取得できる。 OAuth::Twitterの中身は以下の通り。Twitter以外のサービスでもuriを変えれば使えるはず。
require 'oauth' require 'oauth_token' require 'oauth_request' require 'oauth_consumer' require 'oauth_signature' require 'base64' require 'uri' require 'openssl' require 'open-uri' module OAuth class Twitter attr_accessor :request_token, :secret_token def initialize(consumer_key, consumer_secret) @consumer = OAuth::Consumer.new(consumer_key, consumer_secret) end def request_token uri = "http://twitter.com/oauth/request_token" get_token(uri) end def authorize_url(token, callback = nil) url = "http://twitter.com/oauth/authorize" url << "?oauth_token=#{token.token}" url << "&oauth_callback=#{callback}" if callback url end def access_token(request_token) uri = "http://twitter.com/oauth/access_token" get_token(uri, request_token) end def get_token(uri, token = nil) params = { :method => 'GET', :uri => uri, :parameters => { :oauth_version => '1.0' } } req = OAuth::Request.new(@consumer, token, params) query = req.parameters.map {|k,v| "#{k}=#{v}" unless v.empty? }.compact.join("&"); res = {} open("#{uri}?#{query}").readlines.first.split('&').each do |item| key, val = item.split('=') res[key] = val end OAuth::Token.new(res['oauth_token'], res['oauth_token_secret']) end end end