OAuth認証メモ

過去日記では書いていなかったので、復習を兼ねてRubyのoauthライブラリを使ったOAuth認証Twitter APIの呼び出しを試してみます。
FacebookGoogle系のAPIはOAuth 2.0が採用されているようですが、Twitter APIではまだAuth 1.0のみ正式対応なので、今回はOAuth 1.0を使います。

やったこと

Rubyのoauthライブラリは、Railsと組み合わせて、認可ページ (○○アプリがあなたのアカウントを利用することを許可しますか?) にリダイレクト→呼び出し元のページにリダイレクトという動作が基本のようですが、ここではRailsなしで試す前提で、認可ページからPINコードを発行する形で動かしてみます。

  1. Twitterアプリケーション管理ページから、アプリケーションのConsumer key, Consumer secretを取得
  2. 認可用スクリプト (oauth_auth.rb) から認可ページURLを出力
  3. ブラウザから認可ページURLにアクセスし、PINコードを発行
  4. 認可用スクリプトにPINコードを入力 → アクセストークン発行
  5. API呼び出しスクリプト (twitter_api.rb) にアクセストークンを入力し、Twitter APIを呼び出し

テスト環境

oauthは公式のドキュメントが充実していないので結構やっかいでした…

Consumer key/secret取得

Twitterアプリケーション管理ページには、http://dev.twitter.com/apps あるいはTwitterの設定ページ→アプリ連携→開発者 で入れます。

ここで、登録したアプリのConsumer keyとConsumer secretが参照できます。

アクセストークン発行

認可用スクリプトoauth_auth.rbの流れは以下のようになります。

  1. 取得したConsumer key/secretからリクエストークン (RequestToken) 作成
  2. (ブラウザから、リクエストークンに含まれる認可用URLにアクセス→PINコード発行)
  3. RequestToken#get_access_token にPINコードを渡して、アクセストークン (AccessToken) 発行
  4. 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を呼び出してみます。

twitter_api.rb:

# -*- 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アカウントのタイムラインが出力されるはずです。