2009年11月19日木曜日

TwitterとFriendfeedでクライアントアプリケーション名を出すまで

api経由でTwitterやFriendfeedのクライアントを作った時、せっかくなので送信元を自分のアプリケーション名にしたいですよね。
こんな感じに
Twitterの時

FriendFeedの時

[SoraUsagi]経由でポストされた状態になってます! なんにもしてないと [API]って表示されます。
ここに名前を出す方法を以下にまとめ。


アプリケーションを登録

まずは、各サービスにアプリケーションを登録します。
Twitterはこちら
FriendFeedはこちら

空うさぎは、AdobeAIRのデスクトップクライアントなので、application typeをclient、access typeをread&writeにします。
登録すると、Consumer keyと、Consumer secret が貰えます。
これがアプリケーションのキーセットになります。見えないように注意しましょう(公開SVNにコミットしないように!)


OAuthで認証する

Twitter,FriendFeedともにOAuthとBasic認証の両方が使えます。
ですが、Basic認証だと自分のアプリケーション名を表示することができません。
さらに、FriendFeedの場合は、API v2 を使う必要があります。v1ではできません。

ActionScriptの場合、oauth-as3というライブラリがあります。
Twitterの場合は一点をのぞいてほぼそのまま使えると思います。一点とは、下記記述ののSTEP1の注意点のこと。


TwitterのOAuth

□STEP1

http://twitter.com/oauth/request_token にConsumer key/secret を使ってアクセスし、oauth_tokenをもらいます。

送信が必要な情報は以下。

oauth_callback=oob
oauth_consumer_key={アプリケーションのConsumer key}
oauth_nonce=Math.round( Math.random() * 10000 ).toString();
oauth_signature_method=HMAC-SHA1
oauth_timestamp=Math.round( new Date().getTime() / 1000 ).toString();
oauth_version=1.0

var signedURI:String = {上記の認証パラメータの値エンコードしたもの};
var sigBase:String = "GET" + {URLをエンコードしたもの} + signedURI;
var hmac:HMAC = Crypto.getHMAC("sha1");
var accessTokenSecret = "";
var key:ByteArray = Hex.toArray(Hex.fromString(encodeURIComponent({アプリケーションのConsumer secret}) + "&" + encodeURIComponent(accessTokenSecret)));
var data:ByteArray = Hex.toArray(Hex.fromString(sigBase));
var sha:String = Base64.encodeByteArray(hmac.compute(key, data));
var signedURI:String += "&oauth_signature=" + encodeURIComponent(sha);

これでできた singedURLをURLにしてGETで取得。
結果で返ってきた、oauth_token を STEP2で使います。

!!注意点!!
encodeURIComponentって書いてますが、これはActionScriptのメソッド。
ですがこれだと通らない文字がでてくるので、UTF8に変換してエンコードが必要です。
Extended UTF-8 in OAuth ActionScript libraryのサイトを参考にしました。


□STEP2

http://twitter.com/oauth/access_token?oauth_token={oauth_tokenをエンコードしたもの}
のURLでブラウザを開きます。
ActionScriptの場合は、navigateToURLでひらけばOK。

ブラウザが開くと、PINコードとして7桁の数字が表示されます。

□STEP3

http://twitter.com/oauth/authorize にPINコードを使ってアクセスし、accessTokenをもらいます。
STEP1での認証用パラメータに以下を追加した形になります。

oauth_token={STEP2の結果}
oauth_verifier={PINコード}

上手く認証が通れば、以下の結果が返ってきます。
oauth_token
oauth_token_secret
screen_name

これで認証処理はおしまい。
認証が必要なAPIには、ここで取得した、oauth_token, oauth_token_secret を使ってアクセスしていきます。
その際はSTEP1での認証用パラメータに以下を追加します。
oauth_token={STEP3の結果}

oauth_token_secret は、KEYを作り出すときのaccessTokenSecretへ設定。
送信したい情報は認証用パラメータに追加した形でsignします。
その際は、KEY名でソートかけた方がいいみたいです。


FriendFeedのOAuth

FriendFeedの場合はPINでのワークフローが無いです。
そのため、STEP3から始めればOKですが、認証用のパラメータはTwitterの時に比べて、以下を変更します。
oauth_callback=oob を削除。
ff_username={FriendFeedのユーザ名} を追加。
ff_password={FriendFeedのパスワード} を追加。

URL は https://friendfeed.com/account/oauth/ia_access_token に。
(WEBアプリの場合はURLとか変わると思う)

上手く認証が通れば
oauth_token
oauth_token_secret
username
が返ってきます。


色々手続きが面倒ですが、ユーザのoauth_token/oauth_token_secretが万が一漏れても、アプリケーションのConsumer key, secretが分からないとなんにもできない状態になるので、アプリケーションの作り手としてはちょっと安心。
• • •