1月 13 2010
iPhoneとTwitter OAuth認証の流れについて
twitterヘの認証方式は2つありまして、1つはお馴染みBasic認証。もう1つがOAuthです。で、なにやら、今後はOAuthしか受け付けなくなるとかいう話があって、ちょっと盛り上がっているtwitterクライアント界隈。
OAuthの細かい話はさておき、twitterのOAuth認証(access_token取得)の手順には2通りがあります。(太字はiPhone上での主な挙動)
サーバ型
- アプリごとの key から request_token 取得
- request_token を用いて twitter のサイトを表示
→ MobileSafari起動 - ユーザにログインしてもらう
- 設定していた callback URL が呼び出される
→ サーバ側で元アプリの URL scheme にリダイレクトし、元アプリを起動 - callback に渡された oauth_token から access_token を取得
→ アプリ起動時に渡された URL から access_token を取得
クライアントアプリ型
- アプリごとの key から request_token 取得
- request_token を用いて twitter のサイトを表示
→ 内蔵ブラウザで表示 - ユーザにログインしてもらう
- サイトに表示されたPINをアプリに入力してもらう
→ ユーザがブラウザ外のフィールドに別途入力 - 入力された PIN から access_token を取得
まあ、セキュリティ云々の話は別として、どっちもどっちだと思うわけです。サーバ型ではアプリをいったん離れなければなりませんし、クライアントではPINを入力するという手間がかかります。
じゃあ、アプリを離れることなしに、サーバ型の方式は使えないのかと思って試してみました。
やってみたこと
UIWebView の delegate でアクセス予定の URL を取得できます。ここで、指定していた callback URL にアクセスしようとしていたら、そこから oauth_token パラメータを取り出せるのではないかと考えました。
結果
予想通り、UIWebView の delegate で (4) の callback 呼び出しをとらえて、そこから oauth_token を取得することができました。これだと操作がアプリ内蔵の UIWebView だけでとじているので、アプリの切替もPINの入力も要りません。極端な話、callback URL 先の実体すら不要です(存在しないURLを指定していても大丈夫のようです←実際にアクセスする前に request を止めるので当然といえば当然ですが)
delegate 内はこんな感じで。
- (BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
if ([[request.URL host] isEqualToString:@"callback.example.com"]) {
NSString* query = [request.URL query];
NSArray* arr = [query componentsSeparatedByString:@"="];
if ([arr count] > 1 &&
[[arr objectAtIndex:0] isEqualToString:@"oauth_token"]) {
NSString* token = [arr objectAtIndex:1];
// do something
}
return NO;
}
return YES;
}
OAuthの運用上、あるいはセキュリティ上の問題があるかもしれませんが、それらをさておいたとして純粋にユーザ視点にたてば、これが一番スマートなのではないでしょうか、と。
あとは、twitterのログインページがiPhoneに最適化されれば問題ないんですけれど・・・
***一応、手元で開発中にアプリでは問題なく動いているんですが、なんかおかしかったら教えてくださいませ。
1月 14 2010
Cocoa と twitter と OAuth に関する覚書
いろいろと話題のOAuthですが、その意義とか仕組みとかはさておき、実際に実装してみようと思ったときに、ややこしいのはsignatureを作ってリクエストを生成するところなので、そのあたりをざっとメモっておきます。
あくまで個人的な覚書なんで、より詳しくは本家のサイトを参照してください。OAuth Core 1.0a
以下、NSString を ‘&’ や ‘=’ で連結しているかのような記述がありますが、単なる文字連結のイメージですのでご了承下さい。
はじめに
全体を通していえることですが、すべてのGET/POSTパラメータは key, value ともにURLエンコードされている必要があります。(実際 key のほうは不要であることが多いですが)
OAuthでのURLエンコードはRFC3986準拠ですので注意しましょう。CFURLを用いて例えばこんなふうにできます。
以下、http://twitter.com/statuses/user_timeline.xml?screen_name=itok_twit にアクセスすることを前提にメモっておきます。
標準パラメータ
OAuthの標準パラメータとして、以下のようなものがあります。(GETなりPOSTなりで渡す必要があります)
signature
signature の元となる signature base は分解した link や normalized parameter を元に ‘&’ で結合します。
ここで link はいわゆる query をのぞいた部分。
normalized parameter は POST/GETパラメータ(標準パラメータ含む)を全部key=valueの形にして昇順ソートし、それを ‘&’ で結合して1つの文字列にしたものです。
次に HMAC で使う key も ‘&’ で結合。
signature base と HMAC key から HMAC-SHA1 ハッシュを生成し、これを Base64 エンコーディングしてURLエンコードして signature とします。
パラメータに oauth_signature=signature を追加して、最終的にアクセスするURLの出来上がり。
備考
と、ざーっと書き連ねてみました。手元で動いている現状のソースから引っ張ってきたので多分大丈夫と思いますが、なんかおかしかったら教えてください(いつでも弱気)
By itok • iPhone, iPhone開発, ソフトウェア • 1 • Tags: Cocoa, iPhone, OAuth, twitter