2010年6月4日金曜日

FlexでYouTubeビデオのサムネイルを表示するときにセキュリティーサンドボックス侵害が出る場合の対処

FlexでYouTubeのAPIを使ってビデオのサムネイルを表示しようとしていた。

ローカルでデバッグしている時には気づかなかったのだけど、サーバーにアップして試してみると次のエラーが出てサムネールを表示できない。そしてまともに操作できなくなる。

SecurityError: Error #2122: セキュリティサンドボックス侵害 : Loader.content:・・・ は http://i.ytimg.com/vi/・・・/2.jpg にアクセスできません。ポリシーファイルが必要ですが、このメディアがロードされたとき、checkPolicyFile フラグが設定されませんでした。
at flash.display::Loader/get content()
at mx.controls::SWFLoader/get

「i.ytimg.com」はYouTubeのイメージサーバーらしい。

Flexお得意のセキュリティー問題だ。Security.loadPolicyFile()すればいい事はわかる。

そこで第一の問題は、「http://i.ytimg.com/crossdomin.xml
が存在して、どこからでも接続が許可されているかどうかだけど・・・ある!しかもどこからでも接続できるようになっている。すばらしい。Flickrと同じだ。Thanx YouTube!

第二の問題は、ytimg.comドメインのホストがどれくらいあるか?だけど、何回かエラーを出しているとi〜、i2〜というホストがあるようだとわかった。そこで、非常に愚直にi、i2、i3・・・と試してみた。すると、i4まであるらしいことがわかった。

ここまでわかれば後は簡単だ。アプリの初期化メソッドあたりでこのようにすればいい。

Security.allowDomain("www.youtube.com");
Security.loadPolicyFile("http://i.ytimg.com/crossdomain.xml");
Security.loadPolicyFile("http://i2.ytimg.com/crossdomain.xml");
Security.loadPolicyFile("http://i3.ytimg.com/crossdomain.xml");
Security.loadPolicyFile("http://i4.ytimg.com/crossdomain.xml");

これでひとまずエラーは出なくなった。ただし、今後もi5などのホストが追加されることもあるだろうから、その時はまた対処することになるだろう・・・

しかし、ローカルでデバッグしてる時に「Security.allowDomain("www.youtube.com");」してても
*** セキュリティ Sandbox 違反 ***
SecurityDomain 'http://www.youtube.com/apiplayer?version=3' が互換性のないコンテキスト 'file:///・・・
が出るのは、何とかならんのか?

やっぱりFlexのセキュリティー、めんちゃい。普通のHTMLページならどっか別のホストから画像を読んでくるなんて普通にやるじゃないかよぉ〜(^^);

結論。Flexはマッシュアップしづらい。