今回は、
ruby-oauth の使い方
今後RubyでOAuth ConsumerおよびOAuth Service Providerを実装する場合は、
gem install oauth
Ruby OAuth GEMのサイトにも利用方法が紹介されていますが、
そこで今回はこのruby-oauthの実際の使い方を学びながら、
- 未認可のRequest Tokenを取得する
- 認可済のRequest TokenをAccess Tokenと交換する
- Access Tokenを利用した認可を必要とするデータへアクセスする
またそれ以外にブラウザのリダイレクトを利用する通信を行うシチュエーションが2つあります。
- 未認可のRequest Tokenに対してユーザの認可を求める
- 認可済のRequest TokenをConsumerに渡す
基本的には、
- 注)
- Yahoo! OAuthなど、
一部のService ProviderではAccess Tokenの有効期限の延長が必要な例などもありますが、 ここではそういった例は扱いません。
そして、
OAuth::Consumerの利用
未認可のRequest Tokenを取得するには、
@consumer = OAuth::Consumer.new(
CONSUMER_KEY,
CONSUMER_SECRET,
options
)
ここでoptionsには以下のようなパラメータが指定可能です。
options = {
:site => SERVICE_PROVIDER_URL,
:request_token_url => SERVICE_PROVIDER_REQUEST_TOKEN_URL,
:request_token_path => SERVICE_PROVIDER_REQUEST_TOKEN_PATH,
:authorize_url => SERVICE_PROVIDER_AUTHORIZE_URL,
:authorize_path => SERVICE_PROVIDER_AUTHORIZE_PATH,
:access_token_url => SERVICE_PROVIDER_ACCESS_TOKEN_URL,
:access_token_path => SERVICE_PROVIDER_ACCESS_TOKEN_PATH,
:scheme => (:header || :body || :query_string),
:http_method => (:post || :get),
:signature_method => ('HMAC-SHA1' || 'RSA-SHA1' || 'PLAINTEXT'),
:private_key_file => PATH_TO_PRIVATE_KEY,
:oauth_version => "1.0"
}
siteは必須、
request_token_(url|path)、authorize_(url|path)、
access_token_(url|path)
access_
xxx_
xxx_url = site + xxx_path
何も指定しない場合はそれぞれ以下のデフォルト値が利用されます。
:request_token_path => '/oauth/request_token'
:authorize_path => '/oauth/authorize'
:access_token_path => '/oauth/access_token'
signature_method、private_key_file
Service Providerごとにサポートされているsignature_
scheme、http_method
OAuthでは通常はAuthorizationヘッダを利用して通信を行いますが、
:scheme => :header
:http_method => :post
こちらもService Provider側から特に指定の無い限り、
OAuth::RequestTokenの利用
OAuth::RequestTokenはRequest Tokenを保存するクラスです。OAuth::RequestTokenインスタンスを取得するには、
@request_token = @consumer.get_request_token({}, required_parameters)
この時点で@request_
このauthorize_
session[:request_token] = @request_token.token
session[:request_token_secret] = @request_token.secret
redirect_to @request_token.authorize_url + "?oauth_callback=#{callback_url}"
ユーザがRequest Tokenに認可を与えた後Request TokenとAccess Tokenを交換する為にも、
request_token = OAuth::RequestToken.new(
consumer,
session[:request_token],
session[:request_token_secret]
)
@access_token = request_token.get_access_token
OAuth::AccessTokenの利用
Access Tokenが必要なアクセスは、
access_token = OAuth::AccessToken.new(
consumer,
stored_token,
stored_token_secret
)
# GET
access_token.get(PATH_OR_URL)
access_token.get(PATH_OR_URL, HEADER)
# POST
access_token.post(PATH_OR_URL, BODY)
access_token.post(PATH_OR_URL, BODY, HEADER)
# PUT
access_token.put(PATH_OR_URL, BODY)
access_token.put(PATH_OR_URL, BODY, HEADER)
# DELETE
access_token.delete(PATH_OR_URL)
access_token.delete(PATH_OR_URL, HEADER)
smart.fm APIとGoogle Contacts Data APIを利用する
さて、
smart.fm APIの利用
smart.
required_parameters = {api_key => SMARTFM_API_KEY}
@consumer.get_request_token({}, required_parameters)
またAPI KeyはAccess Token取得時にも必要ですが、
# Hacks
# Support params in get_access_token request for smart.fm API's api_key
class OAuth::RequestToken
def get_access_token_with_args(options = {}, *args)
access_token_url = consumer.access_token_url? ? consumer.access_token_url : consumer.access_token_path
response = consumer.token_request(consumer.http_method, access_token_url, self, options, *args)
OAuth::AccessToken.new(consumer, response[:oauth_token], response[:oauth_token_secret])
end
alias_method :get_access_token_without_args, :get_access_token
alias_method :get_access_token, :get_access_token_with_args
end
またAccess Tokenを取得した後、
gem install smartfm
このgemは現在smart.
認可が必要なAPIは、
require 'rubygems'
require 'smartfm'
require 'oauth/consumer'
Smartfm::Config.init do |conf|
conf.api_key = YOUR_API_KEY
conf.oauth_consumer_key = YOUR_OAUTH_CONSUMER_KEY
conf.oauth_consumer_secret = YOUR_OAUTH_CONSUMER_SECRET
end
auth = Smartfm::Auth.new(
:token => OAUTH_ACCESS_TOKEN,
:secret => OAUTH_ACCESS_TOKEN_SECRET
)
## BASIC AUTH
# auth = Smartfm::Auth.new(
# :username => USERNAME,
# :password => PASSWORD
# )
# List API
@list = Smartfm::List.create(
auth,
:title => 'smart.fm gem test',
:description => 'A list for smart.fm gem test'
)
@list.add_item(auth, Smartfm::Item.find(437525))
# Item API
@item = Smartfm::Item.create(
auth,
:cue => {
:text => 'hello world!',
:language => 'en',
:part_of_speech => 'E'
},
:response => {
:text => 'ハローワールド!',
:language => 'ja'
}
)
@item.add_image(auth, 'http://farm4.static.flickr.com/3276/3102381796_a33c1ffdf1.jpg')
@item.add_sound(auth, 'http://matake.jp/download/hello_world.mp3')
@item.add_tags(auth, 'sample', 'programming')
# Sentence API
@sentence = Smartfm::Sentence.create(
auth,
:text => 'Hello World!',
:item => Smartfm::Item.matching('hello world').first
)
@sentence.add_image(auth, 'http://farm4.static.flickr.com/3276/3102381796_a33c1ffdf1.jpg')
@sentence.add_sound(auth, 'http://matake.jp/download/hello_world.mp3')
その他の認可の必要ないAPIの利用方法はsmart.
Google Contacts Data APIの利用
Google Data APIsではscopeをサポートしています。例えばGoogle Contacts Data APIにアクセスする場合は"https://
さらにGoogleの特徴として、
required_parameters = {:scope => "https://www.google.com/m8/feeds"}
@consumer.get_request_token({}, required_parameters)
ruby-oauthでGoogle OAuthを利用する場合は、
その他にはGoogle Apps専用に"2-legged OAuth"と呼ばれるユーザを挟まないOAuthを提供していたり、
補足:Yahoo! OAuthの利用
Yahoo! OAuthは若干特殊な仕様になっているため、
Yahoo! Japanでも今年夏までにはOAuthの提供が開始される予定ですので、
OAuth Consumer開発者の皆様へ
OpenIDでは世界的にも成功事例として認識されている日本ですが、
今後ますます国内のOAuth Consumerが増えていくことを期待しています。