TwitterでOAuth認証

Twitterと連携するWebアプリを作成する場合、TwitterとWebアプリとユーザの3者が、以下のフローで、OAuth認証を行う必要があります。


  1. ユーザがWebアプリにアクセスする。
  2. WebアプリがTwitterから、Request Tokenを取得する。
  3. Twitterのユーザ認証ページにリダクレトする。
  4. ユーザがTwitterにログインし、Webアプリを許可する。
  5. TwitterAccess Tokenを発行し、Webアプリのページにリダクレトする。

Ruby on Rails で、gemのtwitterを使用する場合、以下のようになります。

まず最初に、http://dev.twitter.com/apps/にて、Webアプリの情報をTwitterに登録し、「Consumer key」と「Consumer secret」を取得します。
※コールバックURLは、フローの5番目で、TwitterがリダイレクトするURLとなりますが、ソースコードからでも指定できるため、ここは適当なURLで構わないです。

gemのインストール

sudo gem install twitter

OAuth認証ソースコード

require 'rubygems'
require 'twitter'

class TwitterController < ApplicationController
  # 取得した「Consumer key」と「Consumer secret」を指定する。
  OAUTH_CONSUMER_KEY = ''
  OAUTH_CONSUMER_SECRET = ''

  # OAuth認証
  def index
    # TwitterにリダイレクトするURLを指定して、Request Tokenを取得する。
    request_token = _get_request_token({:oauth_callback => url_for(:action=>'index')})
    # 取得した「request_token」と「request_token_secret」をセッションに保持する。
    session[:request_token] = request_token.token
    session[:request_token_secret] = request_token.secret
    # Twitterの認証画面にリダイレクトさせる。
    redirect_to request_token.authorize_url
  end

protected

  # トークンの取得
  def _get_request_token(prm)
    consumer = _get_consumer
    consumer.get_request_token(prm)
  end

  def _get_consumer
    OAuth::Consumer.new(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET,
        :site => "http://twitter.com")
  end

end

取得したAccess Tokenで認証を行い、つぶやきます。

  # つぶやく
  def tweet
    # TwitterからリダイレクトされたURLのパラメータに認証情報が入ってくる。
    oauth_vrfy  = params[:oauth_verifier]
    access_token = _get_access_token({:oauth_verifier => oauth_vrfy})
    tw_oauth = Twitter::OAuth.new(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET)
    tw_oauth.authorize_from_access(access_token.token, access_token.secret)
    # Access Tokenで認証を行う
    client = Twitter::Base.new(tw_oauth)
    # 入力されたメッセージを取得
    @tweet = Tweet.new(params[:tweet])
    # つぶやく
    client.update(@tweet.message)
    render :action => 'index'
  end

  # トークンの取得
  def _get_access_token(prm)
    consumer = _get_consumer
    access_token = OAuth::RequestToken.new(
      consumer,
      session[:request_token] ,
      session[:request_token_secret]
    )
    access_token.get_access_token(prm)
  end

現在の所、一度発行された、Access Tokenの有効期限は無制限のため、Access Tokenを保持しておけば、次回の認証もこのAccess Tokenを使用して認証できます。