WWDC 2010 のセッションビデオ | Home | このままではまずいよツイッター!
2010/06/20 2:48 | 印刷

JavaScriptには全く関係ない、かなりディープな部分です。ただJavaでWebアプリを開発していてTwitterのAPIを組み入れたい人は必要な情報(かも)なので覚書きです。間違ってるところもあるかも知れないので都度アップデートします。

WebアプリでTwitter APIを利用してつぶやきを投稿するためには、Twitterのユーザーで認証をしなくてはいけません。今までだとBasic認証という簡易認証が許されていたので、何も考えず特定のURLにリダイレクトしてユーザーがダイアログでIDとパスワードを入れてくれれば良かったのですが、セキュリティ問題から廃止されOAuthという少々面倒?なやり方で認証しなくてはいけなくなりました。

Javaでの実装はTwitter4Jという便利なものがあり、しかも日本の方が開発されていて世界中で使われています(素晴らしい)。このTwitter4Jのおかげでとても簡単にTwitter機能が実装出来るのですが、OAuthでの認証処理は難しくまた面倒です。
OAuthの中でもPIN方式とコールバックURL方式があり、PIN方式はデスクトップアプリケーション向けなのでここではコールバックURLでのやり方を検討したいと思います。OAuthの手続きを理解するのとTwitter4Jを使用する場合の関連とを合わせて理解するのが目的です。

OAuth仕様:http://oauth.net/core/1.0a/
Twitter4J公式:http://twitter4j.org/ja/


まず仕様から見ていきます・・・
OAuthのリクエストは3つあります。(Twitterの現状のURLも参考に)

[A] Request Token URL: リクエストトークンの取得
 http://twitter.com/oauth/request_token
 OAuth仕様では「認証されていないリクエストトークン」と書いてますが、
 要するに欲しいのはアクセストークンなので、それを得るための事前キー
 (ペア)と考えて良いかと思います。
 このトークンを得るにはアプリケーションを登録して得られる
 コンシューマキーも必要です。
 さらにこの際に認証後に通知してもらうコールバックURLを指定します。
 レスポンスにリクエストトークン(oauth_token, oauth_token_secret)
 を返します。

[B] User Authorization URL: ユーザー認証URLの取得
 http://twitter.com/oauth/authenticate
 Request Token URLで取得できたトークン(oauth_token,
 oauth_token_secret)を使用してユーザー認証を行います。
 このURLにユーザーのログインやAPIを許可するUIがあります。
 [A]で指定したコールバックURLに認証結果が報告されます。
 正しく認証できたらレスポンスに照合キーを返します(oauth_verifier)。

[C] Access Token URL: アクセストークン取得
 http://twitter.com/oauth/access_token
 コンシューマキーと[A]で取得したリクエストトークン(oauth_token)と、
 [B]で取得した照合キー(oauth_verifier)を送り、処理されるとレスポンスに
 正しいアクセストークン(oauth_token)とその秘密鍵
 (oauth_token_secret)が返ってくるので保存しておきます。
 続けてupdateStatusなど今後のAPI呼び出しが使用できますが、
 再度起動した場合などには保存しておいたアクセストークンを、
 リクエストヘッダにセットすることで都度認証の必要がなくなります。


ではTwitter4Jを使ってOAuth認証する手順を考えてみます。

※ パラメータやヘッダなど細かな取り決めはTwitter4Jがやってくれるので省略します。上記の[A][B][C]の場所を入れてあります。

Step.0
アプリケーション登録(サービスの起動前)
http://twitter.com/oauth_clients/new にアクセス
 [consumer_key], [consumer_key_secret] を取得
 これはサービスで一意に必要な情報なのでアプリケーションレベルで保存
 twitter4j.propertiesに保存するのがデフォルトで簡単

 twitter4j.debug=true
 twitter4j.oauth.consumerKey=xxxxxx
 twitter4j.oauth.consumerSecret=xxxxxxxxxxxxx

Step.1
起動時

 Twitter twitter = new TwitterFactory().getInstance();
 このインスタンスをセッションコンテキストにセット。

Step.2
ユーザーごとの認証(ユーザーがTwitterの使用を求めた時)

 RequestToken requestToken =
 twitter. getOAuthRequestToken(callbackURL) -> リクエスト[A]

Step.3
プロバイダーの認証画面にリダイレクト

 requestToken.getAuthenticationURL()でリダイレクト -> リクエスト[B]
 Twitter4Jでは[A]の処理結果(クラスRequestToken)に認証URLが帰って
 来てるように見えますがこれはパラメータを正しくセットしたURLを返すため
 そうなっています。認証URL[B]はプロバイダー(Twitter)で固定です。

Step.4
リダイレクトされた画面でユーザーが認証およびAPIの許可処理
 プロバイダー(Twitter)のサーバーが処理します

Step.5
プロバイダーがリダイレクト
コールバックURLが呼ばれるので、照合キー(oauth_verifier)を取り出す
拒否の場合はdeniedというパラメータがセットされる。

 RequestToken accessToken = 
 twitter.getOAuthAccessToken(requestToken,oauth_verifier) -> リクエスト[C]
 アクセストークン accessToken.getToken(), getTokenSecret()
 を(マルチユーザーならユーザーごと)保存しておく
 保存できたことをユーザーに知らせるレスポンスなどを返す。

Step.6
再起動時は保存したデータでアクセストークンを生成し

 // 古いバージョン
 TwitterFactory().getOAuthAuthorizedInstance(AccessToken accessToken)
追記:2.2.0以降で変更されました!ConfigurationBuilderを使います。
 ConfigurationBuilder conf  = new ConfigurationBuilder();
 conf.setOAuthConsumerKey(consumerKey);
 conf.setOAuthConsumerSecret(consumerSecret);
 conf.setOAuthAccessToken(token);
 conf.setOAuthAccessTokenSecret(tokenSecret);
 Twitter twitter = new TwitterFactory(conf.build()).getInstance();
で指定してオブジェクトを生成しておくことでTwitter4Jが自動でヘッダに付加してくれるのであとは気にせずupdateStatusなどのメソッドを呼ぶことができます。


以上、まとめたつもりですが読みなおすと、やはり判り難い(汗)
基本的にはOAuthをサポートするGoogleやYahoo!でも応用できると思うので真面目に理解しておく価値はあると思います。

コメント追加

タイトル
名前
E-mail
Webサイト
本文
情報保存 する  しない
  • 情報保存をすると次回からお名前等を入力する手間が省けます。
  • E-mailは公開されません - このエントリーの新規コメント通知が必要なら記入します。