UINavigationController pushViewControllerしてpopViewControllerした時のUIViewControllerのメソッドの呼ばれ方

今さらながらmemo
RootViewControllerがapp.navigationControllerの先頭にある
2011-05-28 21:23:43.771 navcontrollertest[12548:207] RootViewController/viewDidLoad
2011-05-28 21:23:43.773 navcontrollertest[12548:207] RootViewController/viewWillAppear:
2011-05-28 21:23:43.775 navcontrollertest[12548:207] RootViewController/viewDidAppear:
そこにSecondViewControllerをpush
SecondViewController* c = [[SecondViewController alloc] initWithNibName: nil bundle: nil];
[ self.navigationController pushViewController: c animated: YES ];
[ c release ];

2011-05-28 21:23:47.191 navcontrollertest[12548:207] SecondViewController/viewDidLoad
2011-05-28 21:23:47.192 navcontrollertest[12548:207] RootViewController/viewWillDisappear:
2011-05-28 21:23:47.192 navcontrollertest[12548:207] SecondViewController/viewWillAppear:
2011-05-28 21:23:47.548 navcontrollertest[12548:207] RootViewController/viewDidDisappear:
2011-05-28 21:23:47.549 navcontrollertest[12548:207] SecondViewController/viewDidAppear:
backボタンを押した
2011-05-28 21:23:53.395 […]

how twitter @anywhere works

ということでOAuth2のImplicitGrant方式(または古いドラフトではUserAgent方式)ってのはどうなってるのか実例を見ようと、twitterの@anywhereのJSのソース(http://platform.twitter.com/anywhere.js)を読んでみた。
JSがminifyされてるので JsDecoder で読みやすくしたり
ChromeのDeveloper ToolsでどんなURLにアクセスしてるのか見てさらに掘り進んでいったり。
blog.twitter.comに@anywhereがはいってるのでそこで確認してみた。

@Twitter にマウスオーバーするとオーバーレイが出て「フォローする」ってボタンがある
それを押すとポップアップが開き、oauth2の、Clientを認証するか?って聞くダイアログが出るっぽいURL(https://oauth.twitter.com/2/authorize?oauth_callback_url=…略)だが、まずはTwitterにログインするためのTwitterID(またはメアド)とパスワードが聞かれるフォームが表示される、ただしsubmitボタンが「連携する」になってる
「連携する」を押すと、リダイレクトされ、#以降に何やら入っているURLがちらっと表示された後に、ポップアップが閉じる
何事もなかったかのようだが、もう一度 @Twitter にマウスオーバーすると、「フォローしている」と表示される

ここでおもむろにConsoleで
localStorage.twttr_anywhere
とうつと、なにやらtokenがあるようだ。
localStorage.twttr_anywhere_expiry
というのもあって、2時間の有効期限を表して自分で無効化したりするのかな
@Twitterをフォローするリクエストは、これを使って行なわれたようだ。iframe使ったクロスドメインかな
Chrome Developer ToolsのNetworkタブに履歴が残っていたのでそれを再現すると、こんな感じ。

OAuth2のaccess_tokenのような権力をもつtokenだがAuthorizationヘッダが必要な何かみたい。
ということで、JSのみでaccess_tokenとってきたらlocalStorageにいれておいてあって、
それをフォローしたりするリクエストで使っていることがわかりました。
localStorageは
User agents must raise a SECURITY_ERR exception whenever any of the members of a Storage object originally returned by the localStorage attribute are accessed by scripts whose effective script origin is not the same as the origin of the Document of the Window object on which […]

yokohama.pm #7行ってきた

今日来てた人たちのモジュールやコードを使わせていただいているなー、
っていろんな人の顔を見ながら思った!
発表資料
yokohama.pm slide ナカマップのなにか
最後の方のコードはいろいろおかしいので参考になさらないほうがよいでしょう。
でもSocket.IOはクライアント側すごく短くかけてドメイン超えれるし魅力的だなー
なんとかしたい
なんとかしようと思ったときに、
Authorization Code方式(またはImplicit Grant方式)でaccess_token取得した後に、
そのaccess_tokenをSocket.IOのJavaScriptクライアントに渡せるとよいが、どういう経路で安全に渡すことができるんだろう。
Twitterの@anywhereのドキュメントには、
PLAIN TEXT
CODE:

The higher the anywhere.js file is on the page, the sooner it can process the access token.

ってある。
OAuth2のImplicit Grant方式では
Authorization Serverからリダイレクトされてきた時にaccess_tokenが#フラグメント以降に入ってるんだけど
それを他のJavaScriptコードとかから読み取られる前(最初のscriptタグ)にanywhere.jsがあれば
安全ってことなのかな?
上の方にanywhere.js置いてね、って書いてあるけど
スクリプト設置した人が下の方においたら、htmlの上から設置場所までの間にxssでなんか仕込めたらTwitterのaccess_tokenとられちゃうんだよね?
access_tokenの有効期限が短いってことだけどそれでいいのかな?
で@anywhere使ってTwitter認証してリダイレクトされてきたらTwitterにログイン状態で
@anywhereの貼ってあるページ上で誰かをフォローできる、ってことは
access_tokenなのか同様の力を持つものがブラウザにCookieなりlocalStorageなりで保存されてるってこと?
CSRF対策用のトークンみたいなワンタイムな感じなのかな?
わからないことが多すぎる><
anywhere.js を読んでみよう