是否有可靠的方法确保为所有Facebook图像服务器检索跨域策略文件?

时间:2010-08-10 11:10:00

标签: actionscript-3 facebook crossdomain.xml

我最近开始整理Facebook Connect AS3应用程序并通过Graph API检索对象和图像。

在本地运行的任何地方,我收到以下形式的安全错误:
    SecurityError:错误#2122:安全沙箱冲突:Loader.content:xxxx无法访问http://photos-a.ak.fbcdn.net/xxxx.jpg     策略文件是必需的,但加载此媒体时未设置checkPolicyFile标志。

如果我添加一行表格:
    Security.loadPolicyFile( “ht_tp://photos-a.ak.fbcdn.net/crossdomain.xml”);
- 然后我对该服务器很好,但似乎有任意数量的域有照片 - [letter]格式。我已经在字母表中添加了一个 - 它很高兴地成功地检索了跨域文件 - 但它似乎不是一个很好的解决方案,并且不适应任何新的托管设置Facebook 可能将实现在将来。

我考虑过的一件事是在每个图片的基础上检索跨域策略文件,在发出图像请求之前从图像URL捕获域。不幸的是,至少通过Graph解决方案(并且我没有仔细查看其他解决方案),他们的服务器在发出请求后解析图像URL,从更通用的内容如下:
    ht_tps://graph.facebook.com/ [OBJECTID] /画面类型=小和安培; =的access_token [的accessToken]

有没有人找到更可靠的方法来确保在没有安全沙箱违规的情况下检索图像?或者Facebook是否保留了开发人员需要关注的明确列表?

谢谢!

2 个答案:

答案 0 :(得分:7)

将facebook crossdomains加载到应用程序的初始位置,如下所示;

Security.allowDomain("*");
Security.allowInsecureDomain("*");
Security.loadPolicyFile("http://graph.facebook.com/crossdomain.xml");
Security.loadPolicyFile("https://graph.facebook.com/crossdomain.xml");
Security.loadPolicyFile("http://profile.ak.fbcdn.net/crossdomain.xml");
Security.loadPolicyFile("https://profile.ak.fbcdn.net/crossdomain.xml");
Security.loadPolicyFile("http://profile.cc.fbcdn.net/crossdomain.xml");
Security.loadPolicyFile("https://profile.cc.fbcdn.net/crossdomain.xml");
Security.loadPolicyFile("http://fbcdn-profile-a.akamaihd.net/crossdomain.xml");
Security.loadPolicyFile("https://fbcdn-profile-a.akamaihd.net/crossdomain.xml");
Security.loadPolicyFile("http://fbcdn-sphotos-a.akamaihd.net/crossdomain.xml");
Security.loadPolicyFile("https://fbcdn-sphotos-a.akamaihd.net/crossdomain.xml");

然后每当你想从facebook加载图像时,使用Loader的LoaderContext将checkPolicy标志设置为true,如下所示;

var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
context.checkPolicyFile = true;

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadFacebookPhoto);
loader.load(new URLRequest(YOUR_FACEBOOK_PHOTO_URL),context);

private function onLoadFacebookPhoto(e:Event):void
{
    addChild(Bitmap(LoaderInfo(e.target).content));
}

答案 1 :(得分:1)

理想情况下,我猜你会希望Flash自己获取策略文件,而不是用Security.loadPolicyFile触发它。您是否尝试过简单地为装载机checkPolicyFile设置LoaderContext标志?

或者,我相信当您使用URLLoader而不是Loader时,Flash会自动请求策略文件,因此您也可以尝试使用它。棘手的是,如果您使用Loader,即使没有跨域策略,Flash也会让您显示已加载的内容,因此除非您告诉它,否则它不会加载。当您使用URLLoader时,除非有策略文件,否则不允许加载本身,因此Flash会自动获取它。