Titanium MobileでTwitterのOAuth認証をやってみた(iPhone向け/BirdHouse/oauth-adapter)
Androidでは試してないのでiPhone向けと書いておきます。
最近Titanium MobileでのiPhoneアプリ開発が楽しいです。一時期Objective-Cでも1ヶ月くらいやっていたのですが色々大変で、それに比べるとTitaniumはとても楽。変なところでクセがありますが、なにより文法レベルやメモリ管理で悩まなくていいのが嬉しいです。
で、基本的なところはリファレンスや日本語Wikiなどを参考にすればすぐにできますが、ちょっと飛んでTwitterのOAuth認証は苦労したので、参考までにやったことをここにメモしておきます。
oauth-adapter
「Titanium Twitter OAuth」とかでググると大抵出てくるのがoauth-adapterというライブラリですが、イマイチ扱いづらいかったです。
まず現状配布されているr16はauthorizeUICallbackのところでDOMの解析に失敗して落ちます。
エラーにならないようにするには「FYI: Twitter login oauth » Community Questions & Answers » Appcelerator Developer Center」のAnswerにある、「Here is a shorter version:」で始まっているコメントで紹介されているコードに書き換えれば解決します。
この修正でアプリは落ちなくはなりますが、OAuthのキャンセルのフローに対応していません。また、Close操作のラベルもなぜか表示されていません。もしoauth-adapterで実装したいのであれば、ウィンドウにツールバーをつけてそこにキャンセルボタンを置くなどの対処をしたほうがいいと思われます。
(追記) さらに使ってみて分かったのですが、GETメソッドのAPIにも対応していないので、そのあたりも自分で修正しないといけないようです。
(追記) oauth-adapterの上記の問題を解決したライブラリが「mogya/oauth-adapter – GitHub」にて公開されています。このバージョンをベースにするのがよさそうです。
BirdHouse
oauth-adapter以外に何かないか探していて見つけたのがBirdHouseというライブラリです。
こっちはoauth-adapterと違ってアプリが落ちたりはしません。
ただ、OAuth認証が完了した後やキャンセルが押された後にウィンドウが閉じると、なぜかアプリの操作ができなくなるという問題が発生しました。
BirdHouseにはOAuth認証ウィンドウにツールバーを表示させることもできますが、ツールバーを表示させるとウィンドウが閉じてもツールバーだけ画面上に残っているという状態に。
oauth-adapterも同じ処理をしているはずなのにそんなバグは発生しません。なのでoauth-adapterのソースを確認してみると、window.close() ではなく window.hide() が使われていました。
そこで、BirdHouseのソースで「win.close()」となっている箇所を「win.hide()」に書き換えてみると、見事解決!というわけでBirdHouseを使って画面操作ができなくなる場合は、win.close()をwin.hide()に書き換えてみてください。
(追記) 認証できた!と思って安心していたら、なぜかアクセストークンが保存されないという問題が発生。これは致命的・・・。
ちなみにBirdHouseは使ってOAuth認証をおこなう場合は、次のようなコードを書きます。
Ti.include('birdhouse.js'); var BH = new BirdHouse({ consumer_key: 'COMSUMER KEY FOR YOUR APP', consumer_secret: 'CONSUMER SECRET FOR YOUR APP', show_login_toolbar: true // ツールバーを表示するかどうか }); BH.authorize(function() { // 認証後の処理を何か });
まとめ
このようにoauth-adapterもBirdHouseも少しコードを修正してあげる必要がありますが、どちらかというとBirdHouseのほうが扱いやすいかなと思います。。
(追記) 色々試してみると、どっちもどっちで大変だという結論に・・・。
(追記) 「mogya/oauth-adapter – GitHub」を使うのが今のところ一番いいかもです。
あとどちらも oauth.js と sha1.js が必要です。
コメントを残す