OAuth認証メモ
過去日記では書いていなかったので、復習を兼ねてRubyのoauthライブラリを使ったOAuth認証+Twitter APIの呼び出しを試してみます。
FacebookやGoogle系のAPIはOAuth 2.0が採用されているようですが、Twitter APIではまだAuth 1.0のみ正式対応なので、今回はOAuth 1.0を使います。
やったこと
Rubyのoauthライブラリは、Railsと組み合わせて、認可ページ (○○アプリがあなたのアカウントを利用することを許可しますか?) にリダイレクト→呼び出し元のページにリダイレクトという動作が基本のようですが、ここではRailsなしで試す前提で、認可ページからPINコードを発行する形で動かしてみます。
テスト環境
- Ubuntu 11.10 (32ビット版) on VMware Player
- Ruby 1.9.3-p0
- oauth 0.4.5 (RubyGems) http://oauth.rubyforge.org/
oauthは公式のドキュメントが充実していないので結構やっかいでした…
Consumer key/secret取得
Twitterアプリケーション管理ページには、http://dev.twitter.com/apps あるいはTwitterの設定ページ→アプリ連携→開発者 で入れます。
ここで、登録したアプリのConsumer keyとConsumer secretが参照できます。
アクセストークン発行
認可用スクリプトoauth_auth.rbの流れは以下のようになります。
- 取得したConsumer key/secretからリクエストトークン (RequestToken) 作成
- (ブラウザから、リクエストトークンに含まれる認可用URLにアクセス→PINコード発行)
- RequestToken#get_access_token にPINコードを渡して、アクセストークン (AccessToken) 発行
- AccessTokenオブジェクトに含まれるアクセストークンとシークレットを出力
ここで取得したAccessTokenオブジェクトを直接使ってTwitter APIを呼び出すこともできますが、一旦発行したアクセストークンは後で使い回すことができるので、ここで出力したアクセストークンを別スクリプトのtwitter_api.rbで使うことにします。
oauth_auth.rb:
require 'oauth' CONSUMER_KEY = "Consumer Key" CONSUMER_SECRET = "Consumer Secret" consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, :site => "http://twitter.com") request_token = consumer.get_request_token puts "authorize_url = #{request_token.authorize_url}" print "type pin: " pin = gets.chomp access_token = request_token.get_access_token(:oauth_verifier => pin) puts "oauth token: #{access_token.token}" puts "token secret: #{access_token.secret}"
このスクリプトを実行すると、"authorize_url = " に続いて認可用URLが出力されます。ブラウザのアドレスバーにこのURLを入れると、おなじみの認可画面が現れ、「連携アプリを認証」をクリックするとPINコードが出力されます。このPINコードを、"type pin: " のプロンプトに入力すると、リクエストトークン (oauth token) とシークレット (token secret) が出力されます。
Twitter API呼び出し
基本的には、先ほど取得したAccessTokenオブジェクトを使って、
response = access_token.get(url)
のようにすれば、OAuth認証ヘッダつきのHTTPリクエストが発行されます。
前述した通り、一旦発行したアクセストークンを使い回す目的から、Consumer Key/Secret、Access Token/Secretの組からAccessTokenオブジェクトを生成し、そのAccessTokenを使ってTwitter APIを呼び出してみます。
# -*- coding: utf-8 -*- require 'oauth' require 'json' require 'pp' CONSUMER_KEY = "Consumer Key" CONSUMER_SECRET = "Consumer Secret" OAUTH_TOKEN = "Access Token" OAUTH_TOKEN_SECRET = "Token Secret" consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, :site => "http://twitter.com") access_token = OAuth::AccessToken.from_hash(consumer, :oauth_token => OAUTH_TOKEN, :oauth_token_secret => OAUTH_TOKEN_SECRET ) response = access_token.get("http://api.twitter.com/1/statuses/home_timeline.json") result = JSON.parse(response.body) pp result
成功すると、oauth_auth.rb実行途中にブラウザからログインしたTwitterアカウントのタイムラインが出力されるはずです。