RailsでTwitterのOAuth使ってみた

参考にしたサイト

http://tech.lampetty.net/tech/index.php/archives/323

ありがとうございました。

ほぼこの通りですが、トークンの中身や、アクセス・トークンを取得した後にそれを使いまわすやり方に少し苦労したので備忘録メモ。
一応、キーは全て大文字のアルファベットに置き換えてあります。わかりづらいかもしれませんが。。予めご了承ください。

Callback 関数内の動作

request_token の生成

生成

    request_token = OAuth::RequestToken.new(
      consumer,
      session[:request_token],
      session[:request_token_secret]
    )
  • session の中身
session
{:session_id=>"SESSION_ID",
 :request_token=>"REQUEST_TOKEN",
 :request_token_secret=>"REQUEST_TOKEN_SECRET"}
  • request_token の中身
#<OAuth::RequestToken:0xb7a5e6ac @params={},
 @token="TOKEN",     # session[:request_token]
 @secret="SECRET">   # session[:request_token_secret]
 @consumer=#<OAuth::Consumer:0xb7a558cc
   @http=#<Net::HTTP twitter.com:80 open=false>,
   @key="CONSUMER_KEY",
   @secret="CONSUMER_SECRET",
   @options={:site=>"http://twitter.com",
             :authorize_path=>"/oauth/authorize",
             :access_token_path=>"/oauth/access_token",
             :oauth_version=>"1.0",
             :signature_method=>"HMAC-SHA1",
             :http_method=>:post, :proxy=>nil,
             :request_token_path=>"/oauth/request_token",
             :scheme=>:header},
   @http_method=:post>,
access_token の生成
    access_token = request_token.get_access_token(
      {},
      :oauth_token => params[:oauth_token],
      :oauth_verifier => params[:oauth_verifier]
    )
  • access_token の中身。基本的にrequest_tokenにparams が追加されただけ。
#<OAuth::AccessToken:0xb7a3d970 
    @params={"oauth_token"=>"OAUTH_TOKEN",
             :oauth_token=>"OAUTH_TOKEN",
             "oauth_token_secret"=>"OAUTH_TOKEN_SECRET",
             :oauth_token_secret=>"OAUTH_TOKEN_SECRET",
             :user_id=>"USER_ID",
             "user_id"=>"USER_ID",
             :screen_name=>"SCREEN_NAME",
             "screen_name"=>"SCREEN_NAME"},
    @token="OAUTH_TOKEN",
    @secret="OAUTH_TOKEN">
    @consumer=#<OAuth::Consumer:0xb7a558cc
                  @http=#<Net::HTTP twitter.com:80 open=false>,
                  @key="CONSUMER_KEY",
                  @secret="CONSUMER_SECRET",
                  @options={:site=>"http://twitter.com",
                            :authorize_path=>"/oauth/authorize",
                            :access_token_path=>"/oauth/access_token",
                            :oauth_version=>"1.0",
                            :signature_method=>"HMAC-SHA1",
                            :http_method=>:post,
                            :proxy=>nil,
                            :request_token_path=>"/oauth/request_token",
                            :scheme=>:header},
                  @http_method=:post>,

params のハッシュがシンボルと文字列の両方入ってるのは1つにできないのかな。。
「user_id」と「screen_name」が予め両方入っていたので、トークンもそれに合わしてるっぽい。

動作確認

Callback関数で取得したアクセス・トークン(oauch_token)とトークン・シークレット(oauch_token_secret) を保持しておいて、それを使ってAPIをたたく。

class TwitterController < ApplicationController
  def index
    consumer_key       = "CONSUMER_KEY"
    consumer_secret    = "CONSUMER_KEY"
    oauth_token        = "OAUTH_TOKEN"
    oauth_token_secret = "OAUTH_TOKEN_SECRET"

    consumer = OAuth::Consumer.new(consumer_key, consumer_secret, {:site => 'http://api.twitter.com'})
    access_token = OAuth::AccessToken.new(consumer, oauth_token, oauth_token_secret)

    response = access_token.get('/statuses/friends_timeline.json')
    @timeline = JSON.parse(response.body)
    render :text => @timeline
  end
end

その他参考にしたサイト

http://www.atmarkit.co.jp/fsecurity/special/106oauth/oauth03.html

  • oauth-plugin

http://code.google.com/p/oauth-plugin/wiki/AccessToken


いじょー(・ω・)