masat999's posterous http://masat999.posterous.com Most recent posts at masat999's posterous posterous.com Wed, 22 Dec 2010 00:43:00 -0800 iアプリでTwitterのOAuth認証を実装する http://masat999.posterous.com/itwitteroauth http://masat999.posterous.com/itwitteroauth

PHP や Ruby での OAuth 認証については幾つも情報がありますが、iアプリで OAuth 認証をやった話題はとんと見かけません。ドコモマーケットで個人がDXアプリを提供することもできるようになった今、ログを兼ねてどのように実装したか残しておきたいと思います。

(1) ライブラリの入手

J2ME で使える OAuth ライブラリですが、次の2種を検討しました。   

・ Twitter API ME (http://kenai.com/projects/twitterapime/pages/Home)
・ j2me-oauth (https://github.com/simonpk/j2me-oauth) ←今回採用したのはこちら

Twitter API ME は Twitter に特化したライブラリで、Twitter Dev のどこかでも推奨されているような記述がありましたが、結論から言いますと、iアプリでは外部jar の組み込みが簡単にできない仕様から諦めました。少なくともそのまま使うことはできません。(ソースから iアプリライブラリを生成する手順が必要です。面倒、っつーか Write once, Run anyware じゃないのかよ、と…。)

とりあえず今は認証だけどうにかやってみたかったので、少なくとも j2me-oauth で十分です。とはいえこちらも jar をそのまま使うことはできませんので、ソースを再利用して実装しました。

特に Doja/Star では javax.microedition.io パッケージにあるはずのクラスの一部がドコモ独自パッケージにあったり、j2me-oauth 自体にもバグがあったりと、そのまま使えるとまではいきませんでしたが、対処できる範疇でした。access_token で渡すべき oauth_verifier パラメータは自分で追加するなど、多少の修正は覚悟しておきましょう。

もしライブラリを使わずに自力で全部実装するなら、signiture の生成(Twitter は HMAC-SHA1 のみ。書けるスキルがあるならライブラリの再利用の方がよほど楽だと思います)のところが特に大変だと思われます。あとは決まった宛先にパラメータつなげて送受信するだけ、と言ってしまえばそれまでなので。iアプリでは「それまで」のところがまた面倒なんですが、それはまた別の話。

(2) OAuthの認証フローについて

検索には色々ヒットしますが、頭の悪い私には難解すぎて意味不明…。認証フローについて結局一番よく理解できたのが以下の Twitter Dev の情報でした。 xAuth なら 3. 4. の代わりに id, password を渡せば良いはずだと思いますが、xAuth は個別にリクエストして承認してもらえないと使えませんし、Twitter 自体も推奨はしていない方法です。となれば、純粋な OAuth 認証で解決する方法は把握しておきたいものです。

Authenticating Requests with OAuth
Overview of "Sign in with Twitter"

(3) 実装の手順

流れは以下の通りです。xAuth を使わない限り、3. 4. のステップでブラウザアクセスが必要になることは覚悟しておく必要があります。 3. のレスポンスから hidden パラメータ諸共引っこ抜いてアプリで実装できなくもないですが、Twitter の利用規約上それが許されているかどうかまでは調べていないのでやってません。

1. https://api.twitter.com/oauth/request_token から request token を取得する。
2. 取得した request token を保存する。
    * iアプリならスクラッチパッド領域にでも保存してしまえばよろしいかと。
3. https://api.twitter.com/oauth/authenticate にブラウザでアクセスして承認、画面に表示される PIN を入手する。
4. アプリに戻り PIN を入力させる。
    * これも次回以降のアクセスで必要なのでスクラッチパッドですね。
    * request token が変わってしまったら PIN も再取得なので注意。
5. https://api.twitter.com/oauth/access_token に 2. の token と 4. の PIN を渡す。
    * レスポンスから user_id と screen_name ももらえます。
6. OAuth 認証が通れば、statuses/home_timeline, statuses/update などの API が呼べるようになります。

(4) サンプル

詳細出せないので余計に分かりにくいかもしれませんが、ソースはだいたいこんな感じになります。ご参考になれば幸いです。

Consumer consumer = new Consumer(CONSUMER_KEY, CONSUMER_SECRET, "oob");
consumer.setSignatureMethod("HMAC-SHA1");
try {
    String token = null;
    String pin = null;
    if (ScratchPadManager.isSaved(0)) {
        token = ScratchPadManager.loadString(0);
        RequestToken rToken = new RequestToken(token, CONSUMER_SECRET);
        rToken.setAuthorized(true);
        // pin (=oauth_verifier) has to be set.
        AccessToken aToken = consumer.getAccessToken("https://api.twitter.com/oauth/access_token", rToken);
    }
    if (token == null || token.equals("")) {
        RequestToken rToken = consumer.getRequestToken("https://api.twitter.com/oauth/request_token");
        ScratchPadManager.save(0, rToken.getToken());
        Launcher.launch(Launcher.LAUNCH_BROWSER,
            new String[] {"https://api.twitter.com/oauth/authenticate?oauth_token=" + rToken.getToken()});
    }
} catch (OAuthServiceProviderException e) {
    e.printStackTrace();
} catch (BadTokenStateException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/881492/27350_100001241700967_5524_n.jpg http://posterous.com/users/YrBcdfy4Gpb masat999 masat999
Mon, 29 Nov 2010 01:29:52 -0800 iアプリの実装でアレなトコ http://masat999.posterous.com/33857594 http://masat999.posterous.com/33857594

以前書いたネタで、 Androidスゲー!な結論だったんですが、iアプリ版では同じようにやりたいことがイチイチできません。

例えば、高レベルAPIがちっとも高レベルでない。
例えば、低レベルAPIが本当に低レベルすぎてビックリする。

レベル云々はCDLCの標準仕様に準拠しているためでドコモさんのせいでは無いのですけれどね。

ただ、いずれにしてもちょっとアニメーションするボタンを配置したくなったら、全部ゴリゴリ実装しなきゃいけないんですよ。Buttonクラスは高レベルAPIなので使えません。Graphicsクラスでボタン画像をdrawImageして、フォーカスを自分で管理して、onClickもonReleaseも…

一から作る楽しさはあるけど、なんだろう?この愛しさと切なさと(ry

ちなみにドコモさんにはしっかり改善して欲しいポイントがGPS周り。
ブラウザでは Aタグとか Formタグとかに lcs 属性仕込めばGPS搭載機種ならどんなサイトでも動作できるのに、アプリではTrustedアプリの承認が取れないと使えないって…。

結局そんな差を埋めるために作ったのがブラウザアプリ。

iアプリの存在価値、ほぼゼロになったwww

Tmp
そして今の気がかりは Google Static Map API の利用上限回数。携帯だとIPがアレなのすっかり忘れてました。大丈夫かなぁ…。

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/881492/27350_100001241700967_5524_n.jpg http://posterous.com/users/YrBcdfy4Gpb masat999 masat999