February 6, 2010

twitter-auth を使って Rails で簡単 Twitter 認証♪

twitter-auth という Rails プラグインを使うと簡単に Twitter を使った認証が行えるようになります。

http://github.com/mbleigh/twitter-auth

ですが、普通に使おうとすると request_token を取得するところで 以下のようなエラーが出てしまいました。

OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed):
...

サーバー証明書がないためにエラーになっているようなのですが、調べてみたところ twitter-auth には証明書を指定する方法が用意されていませんでした。
なので github で fork して証明書を指定できるようにしてこの問題を回避することにしました。

http://github.com/jugyo/twitter-auth

インストール

./script/plugin install git://github.com/jugyo/twitter-auth.git

使い方

generator が用意されていて、以下を実行すると必要なファイルを作ってくれます。

 script/generate twitter_auth 

migration も作られるので必要に応じてスキーマを編集して rake db:migrate してください。

証明書ファイルの取得

以下のページを参考に、 Twitter の CA 証明書ファイルを取得し、適当な場所に保存します。

http://d.hatena.ne.jp/vividcode/20091031/1256967931

コンシューマーキーとシークレットキーの取得

以下のページからアプリケーションを登録し、コンシューマーキーとシークレットキーを取得してください。

https://twitter.com/apps

設定

config/twitter_auth.yml を編集します。

development:
  strategy: oauth
  oauth_consumer_key: "コンシューマーキー"
  oauth_consumer_secret: "シークレットキー"
  base_url: "https://twitter.com"
  authorize_path: "/oauth/authenticate"
  api_timeout: 10
  remember_for: 14 # days
  oauth_callback: "http://localhost:3000/oauth_callback"
  ca_file: "証明書ファイルのパス"
...

確認

./script/server でアプリケーションを起動し http://localhost:3000/session/new にアクセスすると、リダイレクトされて以下のようなページが表示されると思います。

twitter_oauth

承認を求めているアプリケーションの名前が正しいことを確認し「Allow」ボタンを押してください。
リダイレクトされて http://localhost:3000/ に帰ってきたら成功です。
おめでとうございます。

April 7, 2009

ruby で OAuth を使ってみる実験

ruby で OAuth を使ってみる実験です。

twitter にアプリケーションを登録

まず twitter に自分の作ったアプリケーションを登録します。
自分のアプリケーションが無い場合でも適当なのでいけるんじゃないんでしょうか。
設定画面(Settings)の以下のリンク(丸で囲んだところ)からアプリケーションの登録画面に辿り着けるはずです。

registration

登録画面はこんな感じです。

registration2

登録すると以下のような画面が見れて、「Consumer key」と「Consumer secret」というのが発行されているのがわかります。

registration3

この「Consumer key」と「Consumer secret」を使って認証処理を行います。

oauth をインストール

oauth ライブラリを gem でインストールします。

sudo gem install oauth

irb で実験

irb で実験してみます。

% irb

まず、irb 上で以下を実行してください。

require 'rubygems'
require 'oauth'

consumer = OAuth::Consumer.new(
  "< Consumer key >",
  "< Consumer secret >",
  :site => "http://twitter.com"
)
request_token = consumer.get_request_token
puts request_token.authorize_url

処理に少し時間がかかるかもしれませんが、最後に URL が出力されるはずです。
この irb はまた後で使うので、終了せずにそのまま置いといてください。
出力された URL にアクセスすると以下のような画面が出てくると思います。

registration4

深く考えずに「Allow」をクリックしましょう。
その後、irb に戻り、以下を実行してください。

access_token = request_token.get_access_token

以上で twitter.com での OAuth による認証は完了です。
内部的には「Consumer key」と「Access token」の交換みたいなことが行われています。
取得した「Access token」の情報(token と token_secret の二つ)をアプリケーション側で保持しておけばいつでも認証を通してのアクセスができます。

試しに twitter に何かメッセージをポストしてみましょう。
以下を実行してみてください。

access_token.post('/statuses/update.json', :status => 'test for oauth')

うまく行きましたか?
http://twitter.com/ にアクセスしてみて、ちゃんとメッセージが投稿されていれば実験成功です。

rubytter の OAuth 対応の話

ちなみに、rubytter の OAuth 対応を昨日行いました。
上記で取得した「access_token」を OAuthRubytter というクラスに渡して new すると Rubytter と同じインターフェイスで OAuth な rubytter が楽しめます。

例:

r = OAuthRubytter.new(access_token)
r.update('Hello OAuth!!')