2010年2月7日日曜日

TwitterアプリでOAuth認証

とあるサービスを作る過程でTwitterクライアントを
作ろうと思い、作り始めました。
始めはユーザIDとパスワードを入力してもらおうと考えていましたが
やはり自分のアプリにそれを保存しておくの億劫になり、
OAuth認証で作る事にしました。

まずここに行って
アプリケーションを登録する必要があります。

登録を終えるとアプリケーションのページができて、
キーが2つ発行されます。
「https://twitter.com/apps」で確認ができます。
ちなみに認証して使用しているアプリケーションを確認するには
「https://twitter.com/account/connections」
に行くと確認できます。

さてここで開発開始ですが。。。。
Javaの部分でサービスのアクセスを作成していたのですが、
認証部分はFlexで行った方が画面遷移とか簡単そうだったので
Flex側で書くことにしました。

Twitterさんのサイトに各言語におけるサンプルサイトを紹介しています。
https://twitterapi.pbworks.com/OAuth-Examples

そこでFlexのサイトがあったので
http://www.coderanger.com/blog/?p=59
これを元に作成しました。

なのでここのソースを元に説明していきます。

private var _twitauth:OAuthManager = new OAuthManager();
_twitauth.addEventListener( OAuthEvent.ON_REQUEST_TOKEN_RECEIVED, onRequestTokenReceived );
_twitauth.addEventListener( OAuthEvent.ON_REQUEST_TOKEN_FAILED, onRequestTokenFailed );
_twitauth.addEventListener( OAuthEvent.ON_ACCESS_TOKEN_RECEIVED, onAccessTokenReceived );
_twitauth.addEventListener( OAuthEvent.ON_ACCESS_TOKEN_FAILED, onAccessTokenFailed );
_twitauth.usePinWorkflow = true;
_twitauth.consumerKey = key.text;
_twitauth.consumerSecret = secret.text;
_twitauth.oauthDomain = "twitter.com";
_twitauth.requestToken();


この箇所はアクセス後の呼び出される関数を設定して
アプリケーションで取得したキーの設定を行っています。
サンプルではコントロールから取得している感じになっていますが
ここに設定してあげます。

_twitauth.requestToken();

で最初のリクエストを行っています。
この関数と同時にアプリケーション認証のサイトを別のブラウザで表示してくれます。

ここでユーザが許可し認証を行うと
アプリケーションが認証され、PINコードが表示されます。

そのPINをユーザにテキストボックスなどに入力してもらって


private function onSendPin():void
{
_twitauth.requestAccessToken( Number( pin.text ) );
}


この関数で送ってあげます。
このリクエストで成功した場合「onAccessTokenReceived()」が発生するので
そこでユーザの認証情報を取得できます。

あとはアプリケーションでこの情報を永続化するなどをして
アクセスを行います。
下の方にあるコードはその情報を使ってつぶやいているコードです。


認証を行うとこのようにアプリケーションが追加されます。



おそらくアプリケーションの設定でCallbackURLなどを使って
一部自動化できるような気もしていますが、一応これでつぶやく事ができました。
ただし、このブログ公開時点ではサーバサイドにあげた場合に
アクセスできないという不具合があるので何か間違っているのかもしれません。


このコードを参考にしてオープンソース化されている方もいらっしゃるので
http://code.google.com/p/q-oauth/
ぜひお使いください。

1 件のコメント:

Unknown さんのコメント...

サーバ上からアクセスできない原因は結局色々な複合的な問題だったように思えます。

crossdomainのsecureを変更しろだとか色々な事を言われましたが、最終的に言われたのは「接続を拒否されました」でした。エラーはセキュリティサンドの#2048。。。。一回冷静になってから色々な部分のセキュリティサンドを設定しないと、変なアクセスを受けれる状態になってるかもですね。。。

・・・まとめるにもうまくできるかな。。。