2008年10月29日水曜日

AIRのCookieの扱い

常識なのかも知れないが、知ってる人は知っている、知らない人は知らないと思うので(当たり前だ)、備忘録程度に書いておこう。

AIRは(いやFlash/Flexもだが)HTTPを簡単に扱うことができる。

で、Flash/Flexの場合はWebブラウザの中で動くので、キャッシュやCookieはそのブラウザに保存されるだろうと誰もが思う。その通り。

しかしAIRアプリはブラウザの中で動いているわけじゃないので、キャッシュはまあAIRアプリから使うことはないだろうからいいとして、Cookieはどうしてるのだろうか。自前で保管する仕組みを持ってるのだろうか。などと思ったりする。

だが、いきなり結論。AIRアプリは自前でCookieを持たない。じゃあ、誰が持っててくれるのか。
WindowsならIE、MacならSafari、が持つことになってるらしい。
ま、確かにその2つなら必ず入ってるはずだからね。
(Linux版AIRはどうするのだろう・・・)

これはWindowsでいう「通常使うブラウザ(だったっけ?)」に何を指定しても同じこと。
で、それが悲しい事態を招くのだ。

  1. IEとAIRアプリで同一のサイトに対して別々のアカウントが使えない。

    知っての通りCookieはログインの結果を保存しておいて同一サイト内で、認証済みかどうかを確認するために使われたりすることが多いと思うのですが、AIRとIEでCookieを共有しているせいで、どっちかでログアウトすると両方とも未認証の状態にされてしまうのだ。

    普通に使ってる分には特に問題ないのだが、Googleアカウントのように広範なサービスで同一Cookieを利用されてる場合はやっかいなのだ。ましてやGAEの認証機構(Googleアカウントを使わずに自前でやれなくもないんだが面倒)もGAEの管理者コンソールもどっちもGoogleアカウントなんだ。つまり、AIRアプリの試験をしていてログアウトしたら開発コンソールも未認証の状態にされてしまうってこと。(でもこの辺はちゃんと試したわけじゃないので、鵜呑みにしないように。時間があったら追試しますが)

  2. AIRアプリでログインした状態で、AIRからブラウザを開くと未認証だったりする。

    AIRにしろFlexにしろ、navigateToURLという関数を使うと、(擬似ではなく本物の)ブラウザが開きます。指定したURLの内容を表示して。
    Flexから作ったFlashの場合だと、Flashはブラウザの中で動いてますから、当然同じ種類のブラウザが開きます。IEならIE、FireFoxならFireFox。当然Cookieは共有されてますよね。

    でも、AIRの場合はブラウザの中で動いてません。じゃあ開かれるブラウザは何かっていうと、「通常使うブラウザ」に指定されているブラウザ。IEが嫌でFireFoxにしてるとかいう人も結構いるはずです。

    で、何度も言うけど、AIRはIEとはCookieを共有してるけど、FireFoxとは共有してない。つまりAIRアプリがサイトから認証を受けた状態になってその証拠のCookieを持っていても、そこから開いたFireFoxが認証されているとは限らない、ということなのだ。
    つまり「AIRアプリが接続できるようにしてある認証が必要なサイト」で、そのAIRアプリからブラウザを開くと、ユーザーは2回、認証情報を入力しないといけないってわけ。
1は我慢するとか、CookieはAIRアプリ自身で扱うとか(かなりきついけど・・・)すればなんとかなるので良いですが、2は痛いですねえ。。。これと言って回避策が見つからない。

困った。

Adobeに泣きついてなんとかなる話でもない。メジャーどころならともかく、Adobeのあずかり知らぬブラウザも含めて、AIRからブラウザを起動する時に、AIRの知ってるCookieを起動するブラウザに引き渡せ、ってことだから。

Cookieじゃなくて、アカウント情報(ユーザ名とかパスワード)をAIRアプリで覚えておいて、GETやPOSTのパラメータとして引き渡すことならできるんじゃないか?という意見もあろうかと思う。イグザクトリィ!その通り。
わかっちゃいるのだ。

が、如何せん相手がGoogleアカウントであって、自前の認証機構ではないのだよ。もちろんGoogleアカウントの認証プロキシを作りたいわけもない。さて・・・困ったな。


(2009.11追記)
その後の顛末は『「AIRのCookieの扱い」のその後』に、
補足が『AIRでCookieで』にあります。

0 件のコメント: