2010年2月9日火曜日

OAuthとTwitter4J(Slim3とFlexも)

先日Flex(AS3)でOAuth認証を行いました。
しかし、セキュリティサンドボックスの問題により、棚上げしました。
セキュリティサンドボックスも何かまとめないとですね。

って事でWeb側でTwitterにアクセスしてサービスを実現する事にしました。
結局、プロキシになっちゃいました。
まぁ挙動さえ分かってしまえばこっちのもんです。

ちなみにOAuth部分はTwitter4Jに任せてますので
その挙動を見たければsourceを添付してあげて調べてください。

※ソースは一部関数化してるものを平らにしているので
変数名とかはおかしいかも。。。


Twitter twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(KEY, KEY_SECRET);
try {
RequestToken requestToken = twitter.getOAuthRequestToken();
String url = requestToken.getAuthorizationURL();
requestScope("url",url);
sessionScope("requestToken",requestToken);
} catch (TwitterException e) {
new RuntimeException(e);
}


まず、Twitterオブジェクトを取得してアプリケーションのキー値を設定します。
そこからURLを取得してきます。それを返します。

その後、Pinを取得して処理する場合に新たにRequestTokenを作成すると
おかしくなるのでセッションに設定しました。
※requestScope(),sessionScope()はSlim3のメソッドです。
リクエストやセッションに溜め込んでください。

そのリクエストを元にURLにアクセスします。
私の場合はFlexなので


//リンクを飛ばす
navigateToURL(new URLRequest(oauthUrl));


って感じになりました。

ここにアクセスすると横の画像のWebが別ブラウザで表示されます。
Twitterアカウントを入力すると認証され、



Pinが表示されます。
。。。。画像で表示されます。選択してコピーして
そのPinを自分のWebページなどで入力します。

。。。ここでコールバックなどをうまく使えば
多分何手かUIを改善できそうな気がするんですけどね。



私の場合はそれを元にPinを入力して再度サーバサイドで処理を行いました。


Twitter twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(KEY, KEY_SECRET);
String pin = requestScope("pin");
RequestToken requestToken = sessionScope("requestToken");

AccessToken accessToken = null;
try {
accessToken = twitter.getOAuthAccessToken(requestToken, pin);
} catch (TwitterException e) {
throw new RuntimeException(e);
}
String token = accessToken.getToken();
String tokenSecret = accessToken.getTokenSecret();


先ほど保存しておいたRequestTokenと取得したPinをリクエストから受け取り、
AccessTokenを取得します。
それによりトークンを取得する事が必要です。

私はここでSlim3 Datastoreを使用して、トークンを永続化しています。
ちなみにですが、私が作ってるのは認証アプリなので
認証をしたUserオブジェクト(GAE)も保存しています。


その後はログインしたユーザを元に
このトークンを取得してきて処理をします。


Twitter twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(KEY, KEY_SECRET);

AccessToken accessToken = new AccessToken(data.getToken(),data.getTokenSecret());
twitter.setOAuthAccessToken(accessToken);
twitter.updateStatus(tweet);


dataは永続化したオブジェクトです。
updateStatus()はtwitter4jのつぶやく機能です。

こんな感じでサービスを作成しました。
ユーザ情報を保存したくなくて、OAuthに対応しましたが、
色々とツールがあって簡単にできるもんですね。

1 件のコメント:

Unknown さんのコメント...

コールバック化できました。

アプリの設定をBrowserにして
CallbackURLを設定します。

許可するとそのURLに転送されます。
PINの設定もせず、
accessToken = twitter.getOAuthAccessToken(requestToken);

と行うとトークンが取れます。

ちなみに拒否された場合
”denied”が引数に渡ってくるので
そこで判定できます。
※他に方法あるのかも。