3

我最近开始整合 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");
- 那我对那台服务器没问题,但似乎有任意数量的域具有照片-[字母]格式。我已经为字母表中的每一个都添加了一个 - 它可以成功地检索跨域文件 - 但它似乎不是一个好的解决方案,并且不适应 Facebook将来可能实施的任何新的托管设置。

我考虑过的一件事是基于每个图像检索跨域策略文件,在发出图像请求之前从图像 URL 捕获域。不幸的是,至少通过 Graph 解决方案(我并没有仔细研究其他解决方案),他们的服务器在发出请求后解析图像 url,从更通用的东西,例如:
ht_tps://graph.facebook.com/ [objectId]/picture?type=small&access_token=[accessToken]

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

谢谢!

4

2 回答 2

7

在您的应用程序的初始加载 facebook 跨域,如下所示;

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));
}
于 2012-11-02T00:44:45.973 回答
1

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

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

于 2010-08-11T03:46:02.227 回答