OAuth Consumerサンプルを動かす
第1回では実際にOAuthを利用したサービスを触り、
第2回と第3回では、
Ruby on Railsの構築に関しては、
まずはgithubに公開されているoauth_
git clone git://github.com/nov/oauth_sample.git
その後railsアプリを起動します。筆者のMacBook上では以下で問題なく起動しますが、
gem install sqlite3-ruby
gem install oauth
cd oauth_sample/oauth_consumer
mkdir log
rake db:migrate
./script/server
http://
smart.fmにOAuth Consumer登録
サンプルアプリケーションのdashboardには
![図1 Consumer情報の登録 図1 Consumer情報の登録](/assets/images/dev/feature/01/oauth/0002/thumb/TH800_01.jpg)
このアプリは、
![図2 smart.fm OAuth Client Applications 図2 smart.fm OAuth Client Applications](/assets/images/dev/feature/01/oauth/0002/thumb/TH800_02.jpg)
今回のアプリケーションを利用する場合、
- Main Application URL : http://
localhost:3000 - Callback URL : http://
localhost:3000/ oauth/ smartfm/ callback
登録後、
OAuth Access Tokenの取得
Consumer登録が完了したので、
![図3 「authorize access」にチェックを入れて「save」 図3 「authorize access」にチェックを入れて「save」s](/assets/images/dev/feature/01/oauth/0002/thumb/TH800_03.jpg)
これで再びdashboardにリダイレクトされて、
さて、
サンプルアプリケーションで実際にAccess Token取得に関わるのは、
- OauthAccessTokensController
(oauth_ consumer/ app/ controllers/ oauth_ access_ tokens_ controller. rb) - OauthConsumer
(oauth_ consumer/ app/ models/ oauth_ consumer. rb)
Request Tokenの取得
smart.
class OauthAccessTokensController < ApplicationController
def new
redirect_to request_token.authorize_url
end
private
def request_token
request_token = oauth_consumer.get_request_token
session[:request_token] = request_token.token
session[:request_token_secret] = request_token.secret
request_token
end
end
ここではまずrequest_
sudo tcpflow -c
これを見ると、
POST /oauth/request_token HTTP/1.1
Connection: close
Accept: */*
Content-Type: application/x-www-form-urlencoded
Authorization: OAuth oauth_nonce="SOME_NONCE_IS_HERE", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1236450076", oauth_consumer_key="SMARTFM_CONSUMER_KEY", oauth_signature="SOME_SIGNATURE_IS_HERE", oauth_version="1.0"
Host: api.smart.fm
Content-Length: 32
そしてsmart.
oauth_token=SMARTFM_REQUEST_TOKEN&oauth_token_secret=SMARTFM_REQUEST_TOKEN_SECRET
その後、
Request TokenとAccess Tokenの交換
ユーザがsmart.
class OauthAccessTokensController < ApplicationController
def create
new_access_token = oauth_consumer.get_access_token(params[:oauth_token], session[:request_token_secret])
store_access_token(new_access_token)
redirect_to_dashboard
end
private
def store_access_token(access_token)
OauthAccessToken.create(
:user => current_user,
:oauth_consumer => oauth_consumer,
:token => access_token.token,
:secret => access_token.secret
)
end
end
createアクションでは、
POST /oauth/access_token HTTP/1.1
Connection: close
Accept: */*
Content-Type: application/x-www-form-urlencoded
Authorization: OAuth oauth_nonce="SOME_NONCE_IS_HERE", oauth_signature_method="HMAC-SHA1", oauth_token="SMARTFM_REQUEST_TOKEN", oauth_timestamp="1236452101", oauth_consumer_key="SMARTFM_CONSUMER_KEY", oauth_signature="SOME_SIGNATURE_IS_HERE", oauth_version="1.0"
Host: api.smart.fm
Content-Length: 32
api.
oauth_token=SMARTFM_ACCESS_TOKEN&oauth_token_secret=SMARTFM_ACCESS_TOKEN_SECRET
サンプルアプリケーションではstore_
Access Tokenを使ってみる
最後に得られたAccess Tokenを利用して、
require 'rubygems'
require 'oauth/consumer'
SMARTFM_API_KEY = 'YOUR_API_KEY'
CONSUMER_KEY = 'YOUR_CONSUMER_KEY'
CONSUMER_SECRET = 'YOUR_CONSUMER_SECRET'
ACCESS_TOKEN = 'USER_ACCESS_TOKEN'
ACCESS_TOKEN_SECRET = 'USER_ACCESS_TOKEN_SECRET'
consumer = OAuth::Consumer.new(
CONSUMER_KEY,
CONSUMER_SECRET,
:site => "http://api.smart.fm",
:authorize_url => "http://smart.fm/oauth/authorize"
)
access_token = OAuth::AccessToken.new(consumer, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
response = access_token.post(
'/lists',
{ :api_key => SMARTFM_API_KEY,
'list[name]' => 'OAuth test',
'list[description]' => 'A list for OAuth test',
'list[language]' => 'en',
'list[translation_language]' => 'ja' })
puts response.inspect, response.body
まとめ
今回はOAuth Consumerのサンプルアプリケーションとtcpflowを用いて、