Flash UI からnavigateToURL()でOAuth認証

全面Flashで作られたガジェットでの、OAuth認証プロセスで嵌った点をメモ。

Opera、Safari、Firefox、IEのそれぞれで、Javascriptまでを駆使するPopupブロックの回避法は、それぞれ違ったり、なかったり(?)するみたいということで、Flashのマウスイベント内に置いたnavigateToURL()で、認証画面を開く。

そのためのURL+パラメータは、gadgets.io.makeRequestの戻り値のres.oauthApprovalUrlから得ておく。こんな値。

https://www.google.com/accounts/OAuthAuthorizeToken?
oauth_callback=http://oauth.gmodules.com/gadgets/oauthcallback&
oauth_token=*******

この戻り値を単純にnavigateToURL( res.oauthApprovalUrl)と入れてやると新しいタブ(ウィンドウ)にhttps://www.google.com/accounts/OAuthAuthorizeTokenのページが開き、認証が表示される。

認証がすむとoauth_callback=のURL、http://oauth.gmodules.com/gadgets/oauthcallbackに飛んで、すぐにWindowは閉じられる。

サンプルに使われているpopup.jsを使用していると、ポップアップWindowが閉じられたのを検出してonClose:に設定されたfunctionが実行される。サンプルでは再度リクエストを実行している。

ここで、FlashからnavigateToURL()した場合、新しく作られたWindowのCloseを検出することができない。

コールバック(http://oauth.gmodules.com/gadgets/oauthcallback)はどうなっているのかと見てみると、以下の短い内容でした。
<html>
<head>
<title>Close this window</title>
</head>
<body>
<script type='text/javascript'>
try {
  window.opener.gadgets.io.oauthReceivedCallbackUrl_ = document.location.href;
} catch (e) {
}
window.close();
</script>
Close this window.
</body>
</html>

このhtmlを自前のガジェットで置き換えてやるか、gadgets.io.oauthReceivedCallbackUrl_の内容の変化を監視してやると、認証画面が終了したことを知ることができる。

実はまだためしていない。。。

またOAuth周りののテストのために、OAuthを一旦解除するのがとてもめんどい。

http://shindig.apache.org/shindig-1.1.x/shindig-features/jsdoc/symbols/src/_home_lindner_projects_shindig_trunk_target_checkout_features_src_main_javascript_features_core.io_io.js.html