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が分からないとなんにもできない状態になるので、アプリケーションの作り手としてはちょっと安心。