Ruby で OAuth を使ってみた (3)
2007-11-06
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