Ruby Twitter GemでOAuth認証のクライアントを作る

Ruby Twitter Gemというのがあります。これを使えば楽にできます。
前、botを作るところでとりあげました。
Ruby Twitter Gemでボットを作ろう « てっく★ゆきろぐ Rev2
基本的には、上記でやってることと変わりません。
認証のところが違うくらいです。

#!/usr/bin/ruby

require 'rubygems'
gem 'twitter'
require 'twitter'

# この2行が違うだけ
tw_oauth = Twitter::OAuth.new( OAUTH_CONSUMER_KEY , OAUTH_CONSUMER_SECRET )
tw_oauth.authorize_from_access( oauth_access_token  , oauth_access_secret )

client = Twitter::Base.new(tw_oauth)
client.update( postdata )

以前HTTP Basic認証のときは、Twitter::HTTPAuth を使ってましたが、OAuth認証の場合は、Twitter::OAuth を使います。
違いはこれだけ。

これだけでは半分。
OAuthを使う場合、認証が必要になります。
この認証を経て、APIにアクセスするためのアクセストークンが取得できます。
それでは、認証開始から、アクセストークンをもらってくるまでの処理を書いてみたいと思います。
流れについては、twitterでOAuthを使う方法(その1:認証まで): てっく☆ゆきろぐ にて書いてありますので、そちらの解説を参照いただければなと思います。
※あらかじめ、アプリケーション管理画面でコンシューマキー等は取得しておいてくださいね。

●ステップ1:リクエストが来たので、twitterへリクエストトークンを要求する。その後認証画面へリダイレクト
今回の処理には、普通にCGIを使うことにします。
CGI処理は、Rubyにもともと入ってるcgiライブラリを利用することにします。
そして、セッション管理には同じくRubyにもともと入ってるcgi/sessionライブラリを利用します。
そして、OAuthの処理をしてくれるのが、Ruby OAuth GEM
入れるためにはこれ一発。

# gem install oauth

そんなわけで使用宣言、こうなります。

#!/usr/bin/ruby

require 'rubygems'
gem 'oauth'
require 'cgi'
require 'cgi/session'
require 'oauth/consumer'

CGIのセッション開始処理。
今回はセッション変数にrequest_token等、各ユーザーごとの機密情報が入ってきますので、tmpdirの場所を「自分の手の届く」適切な場所に変更します。

cgi = CGI.new
session = CGI::Session.new(cgi,{"new_session"=>true,"tmpdir"=>workdir })

そして、ここからが、OAuthの処理本体となります。
まず、OAuth::Consumerのインスタンスを作ります。
オプションでコールバック先のURLを与えるのを忘れないでくださいね!

onsumer = OAuth::Consumer.new( OAUTH_CONSUMER_KEY , OAUTH_CONSUMER_SECRET , {
    :site=>"http://twitter.com"
    })
optprm = { :oauth_callback=>"(コールバック先のURL)" }
request_token = consumer.get_request_token( optprm , { } )

これで、リクエストトークンが要求されて、request_token に入ってきます。
取得されたリクエストトークン情報をセッション変数に入れておきます。(あとで使うため)
入れたあと、authorizeのURLに移動させます。

session["request_token"] = request_token.token
session["request_token_secret"] = request_token.secret
print cgi.header( 'Location' => request_token.authorize_url )

これで、このCGIにアクセスすることによって、リクエストトークン取得から、認証画面への移動までがなされます。

●ステップ2:サービスプロバイダでの認証
リダイレクトされて、サービスプロバイダ(この場合twitter)の認証画面に飛びます。
2010021101
「Allow」ボタンが押されたら、さきほど与えたコールバック先URLに飛ばされます。

●ステップ3:アクセストークンの取得
コールバックされた先で、サービスプロバイダへ再度アクセスして、アクセストークンをもらいます。
必要なライブラリはステップ1と同じなので割愛。
今度はサービスプロバイダからパラメータがくるので、CGIでのパラメータ取得必須。
それと、CGI::Sessionの引数を間違えて、セッション初期化しないようにね。

cgi = CGI.new
session = CGI::Session.new(cgi,{"tmpdir"=>workdir })
oauth_token = cgi["oauth_token"]
oauth_vrfy  = cgi["oauth_verifier"]

そして、アクセストークン要求を行います。
このとき、ステップ1で使ったリクエストトークンの情報が必要になります。

consumer = OAuth::Consumer.new( OAUTH_CONSUMER_KEY , OAUTH_CONSUMER_SECRET , {
    :site=>"http://twitter.com"
    })

# ステップ1で作ったリクエストトークンを利用する
request_token = OAuth::RequestToken.new(
  consumer,
  session["request_token"] ,
  session["request_token_secret"]
)

# アクセストークン要求
prm = { :oauth_verifier => oauth_vrfy }
access_token = request_token.get_access_token( prm )

これでアクセストークンの取得ができます。
取得したアクセストークンはsessionに入れておきます。

session["access_token"] = access_token.token
session["access_secret"] = access_token.secret

print cgi.header( "Location"=>"main.cgi" )

余談ですが、ここで各種動作が正規ルートで来ているかのチェック用に(要するにCSRF対策で)確認用のキーを作るのもいいでしょう(ここでは敢えて割愛)。
※CSRFってなんじゃってかたのために。以下の記事あたり参考になると思いますよ!
 [はまちちゃんのセキュリティ講座]ここがキミの脆弱なところ…!:第2回 しーさーふって何ですか?|gihyo.jp … 技術評論社

以上で、アクセストークン等の、必要な情報の取得は終わりです。
あとは使うところで、

oauth_access_token = session["access_token"] 
oauth_access_secret = session["access_secret"]
tw_oauth = Twitter::OAuth.new( OAUTH_CONSUMER_KEY , OAUTH_CONSUMER_SECRET )
tw_oauth.authorize_from_access( oauth_access_token  , oauth_access_secret )
#以下略

と、するだけ。

・・・はい。
実はこの実装のサンプルが、まいんぼたんだったりします(笑)

2 Responses to “Ruby Twitter GemでOAuth認証のクライアントを作る”

  1. morio says:

    役に立つ情報をありがとうございます。
    ただ・・・一箇所、consumer が onsumer になってます><