2010年02月15日

タイトル長めですが、大事なことなので全部書きました。

コードはこちら:

メインのライブラリ/タイムラインを取得するサンプル
gist: 304123 - GitHub(最終更新:2010.02.15 11:26)
発言を投稿するサンプル(上記ライブラリと組み合わせてご利用下さい)
gist: 306853 - GitHub(最終更新:2010.02.18 3:09)

概要

Twitterでは、OAuthという認証のシステムが利用できる。

従来は、(ユーザ認証を伴う)TwitterのAPIを利用する際、APIの呼び出しのたびにユーザ名・パスワードを送信する必要があった。一方OAuthでは「トークン」と呼ばれる、ランダムに生成された文字列を、APIへのアクセス権限を証明するものとして発行する。実際にAPIを利用する際には、このトークンを用いてアクセスすれば、ユーザ名やパスワードを送信する必要はない。(詳しくはAPIアクセス権を委譲するプロトコル、OAuthを知る − @ITを参照)

なお、「あるユーザAの出来る行為」に対応するトークンを発行するためには、(1)ユーザAがTwitterにログインした状態でトークン発行ページにアクセスするか、(2)ユーザAのユーザ名およびパスワードを送信してトークンを直接取得する(xAuth)必要がある。

トークンを介する利点として、Twitterと連携するウェブサービス(例えば、アップロードした写真をTwitterに通知する)が、Twitterユーザのパスワードを直接記録せずにTwitterの機能を利用できるということが挙げられる((1)の方法を使えば、ウェブサービス側にはトークンしか通知されないため)。これはセキュリティ上も、ユーザの心理という面でも便利である。

経緯

上記(1)の方法でのトークン取得が、Twitterと連携するウェブサービスに適した方法であるのに対し、(2)の方法は、各個人のコンピュータにインストールされるTwitterクライアントなどに適しているといえる。これらのクライアントは、ブラウザと無関係に動くほうが当然便利であるし、またユーザがパスワードをクライアントに伝えずに利用することはそもそも不可能だからである。

(1)の利用法はすでに多く用いられている一方、(2)の利用法はあまり広まってはいないのが現状である(後述)。これは(2)の方式が後で追加された仕様であること、また従来の「APIの呼び出しのたびにユーザ名・パスワードを送信する」方法(具体的には、Basic認証)で事足りていたというのが大きいと思われる。

しかしつい先日、TwitterがBasic認証でのAPI利用を6月ごろに終了するというアナウンスを出した。そのため、今後はBasic認証を用いていたサービス・アプリケーションは、OAuthを用いるものに移行する必要が生じた。

さて、私はtwbot.rbという、RubyでTwitterボットの制作を補助するライブラリを作っている。これはxAuth、つまり(2)の方法でのトークン取得が適しているケースといえる。しかしWeb検索を利用しても、RubyにてxAuthでトークン取得を行うためのコードが見つからなかった。それを書いたのがこのコードである。

これまでのコードと解決法

これまでにも、RubyにてOAuthを利用するコードはいくつか公開されていたものの、いずれも(1)の方法、すなわちブラウザを介してトークンを取得するものであった。

Twitterでこのことについて投稿したところ、@rokudenashi氏から「xAuthでのトークン発行はすでに実現できている」との情報をいただき、そのPythonコードを拝見させて頂いた。そこで、これをRubyに移植することにした。

さらに調べたところ、xAuthはHTTPヘッダに追加の情報を加えることで行うことが分かった(参考:OAuthでデスクトップアプリがブラウザを経由させたくないときのxAuth - Codin’ In The Free World)。これを踏まえ、RubyのOAuthライブラリのリファレンスや、xAuthを利用しているコードの一部とにらめっこしながら、前述のコードを書き上げるに至った。

コードの解説

大した内容ではありませんが、念のため解説。

最初のconsumer = OAuth::Consumer.new …の部分は、他のサンプルなどでも見られるコードである。ただし、アクセス先を「https://」と「api.twitter.com」にしないとならない模様(「http://」では403エラーになった)。

次のconsumer.get_access_token …の部分で、いきなりアクセストークンを取得する((2)の方式でなく(1)の方式を用いる場合は、その前に「リクエストトークン」という別のトークンを取得する必要がある)。この際、HTTPヘッダにユーザ名やパスワードを書いておく必要があるため、第3引数にユーザ名・パスワードおよび、「:x_auth_mode => "client_auth"」(xAuthを利用している、という情報)を加えてある。

追記:OAuthのアプリケーション登録方法

(2010.02.18 3:09追記)

本コードは、利用される皆様がそれぞれOAuthのアプリケーションを登録する、という想定のもとで書かれています。お手数ですが、OAuthのアプリケーション登録を行い(参考:TwitterのbotをOAuthに対応させる - しばそんノート→「OAuthクライアントを登録する」)、そのConsumer key/secretを用いてお試し下さい。

(2010.04.15 23:14追記)

遅ればせながら。
Twitter APIにおけるxAuthの正式サービス開始に伴い、メールで申請されたアプリケーション以外はxAuthが利用できなくなりました。(参考:Twitter API Wiki / Twitter REST API Method: oauth access_token for xAuth
このためxAuthを用いるアプリケーションを作成するには、上記方法でアプリケーションの登録を行ったのち、api@twitter.com に「アプリケーション●●をxAuthでも使えるようにして下さい」という内容のメールをしないとなりません。

おわりに

xAuthの利用方法について貴重な情報を下さった@rokudenashi氏、IRCで議論して下さった@niku_name氏・@onodes氏、更にインターネット上の各情報に感謝の意を表します。

このコードが、皆様のRubyでのxAuth利用の助けになれば幸いです。



maraigue at 02:50コメント(0)トラックバック(1)プログラミング | Twitter 

トラックバックURL

トラックバック一覧

1. TwitterでBasic認証の替わりの認証方法について調べる  [ ラボブログ ]   2010年05月06日 00:07
DAC/スパイスラボ神部です。 Twitterでサービスを作る際、Basic認証を使ったものは無数にあるかと思いますが、6月末でそれらがシャットダウンされるにあ...

コメントする

名前
URL
 
  絵文字
 
 
livedoor プロフィール
  • ライブドアブログ