2010-10-19 177 views
13

我想从AS3加载Facebook的个人资料图像(朋友图像),但我似乎遇到了安全问题。从ActionScript加载个人资料图片与动作脚本3

我目前使用Actionscript 3的“官方”Adobe Facebook API工作正常。但是,在浏览器中运行我的应用程序时,我似乎无法加载配置文件图像。在Flash IDE中运行时,图像加载正常。

的图像从https://graph.facebook.com加载并似乎有在该域的crossdomain.xml策略:

<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
    <allow-access-from domain="*" secure="false" /> 
<site-control permitted-cross-domain-policies="master-only" /> 
</cross-domain-policy> 

在其它来源我发现,装载应的图像时添加的ContextLoader我Loader对象解决问题,但这似乎并非如此:

loader = new Loader(); 
// add some listeners here... 
loader.load(new URLRequest("imageurl"), new LoaderContext(true)); 

我不太确定如何进行此刻。我希望Adobe Facebook API能够提供这方面的帮助,但我似乎无法找到解决此问题的任何事情。

任何帮助非常感谢。

UPDATE:

我注意到,当我访问该实际上,我重定向到Facebook的CDN,其中实际图像存储在浏览器中的图像之一。当我使用重定向的URL对图像url进行硬编码时,我可以在浏览器中加载图像。看来,这不是一个安全问题,而是一个重定向问题。

如果这是一个重定向问题,那么问题就会变成;我如何让Flash Player从重定向的URL加载图像?

更新2:

看来,URLRequest类具有followRedirects财产仅在AIR提供。

更新3:

我目前使用一个PHP script让我重定向的URL作为一个变通,但这当然是远远不够理想,并可能在我的服务器上一个巨大的压力。

+0

感谢卢克!我仍然需要在不同的项目上再次使用这个解决方案,很奇怪,它只是在这里吗? – daidai 2010-11-09 05:33:18

+0

卢克,你是如何实现重定向的PHP?即时通讯仍然有问题。 – daidai 2010-11-09 06:15:37

+2

@ martin的方法工作得很好。问题确实是由重定向造成的。我打电话给“http:// graph.facebook.com”,它重定向到Facebook的图像服务器。除了'http:// profile.ak.fbcdn.net',Facebook还使用其他服务器。我找到的是'http:// external.ak.fbcdn.net'。多次调用'Security.loadPolicyFile'来解决这个问题 – 5566 2011-08-11 02:37:47

回答

11

我有同样的问题,它看起来像你必须手动加载的跨域文件您将被重定向到actionscript中的域。现在,它看起来像所有的Facebook配置文件图像终于从域http://profile.ak.fbcdn.net/加载。

我只是说此行加载图像之前:

Security.loadPolicyFile("http://profile.ak.fbcdn.net/crossdomain.xml"); 

这应该允许加载重定向的图像,只要重定向域不会改变。;)

+3

它在这一点上已经改变。这是现在的有效路径:https://fbcdn-profile-a.akamaihd.net/crossdomain.xml – weotch 2011-10-18 20:21:04

+0

今天永远摸着这个问题。这是解决方案。谢谢! – Ribs 2012-03-13 22:32:23

+0

还有另一个域名:https://fbcdn-profile-b.akamaihd.net/crossdomain.xml,用于页面个人资料图片,另一个用于照片。 – kixorz 2013-05-18 23:31:30

1

它应该是一件相当容易的事情,所有的Facebook个人资料图片都可以通过使用图片API的图片根找到。像这样的链接:

“http://graph.facebook.com/” +用户ID +“/图片”

+0

你好。我很感谢你的回答,但我不觉得你实际上是在阅读我的问题。我知道如何从Facebook加载图片,这是我正在处理的安全问题。 – Luke 2010-10-19 19:55:29

+0

应该没有任何问题,因为我自己做了很多次。你的嵌入式闪存是否启用了scriptaccess? – longstaff 2010-10-20 06:18:36

+0

我有scriptaccess启用,因为一切正常。这绝对是导致问题的重定向。 – Luke 2010-10-22 21:47:38

1

我想在这里确认马丁的解决方案。

我的案子最后从测试的AIR平台这是很好的伟大工程,形象成功加载的应用程序。

但是,当我将它移植到Facebook上的画布应用程序,然后我面临的一个问题,个人资料图片不会一起去,它不能加载。

我所用马丁在这里建议。如果你跟踪一个URL重定向,你会看到实际的图像配置文件位于该CDN服务器而不是Facebook本身,所以你需要根据actionscript的安全沙箱加载该域的策略文件。

再次感谢。

0

完全猜测,但你可以使用的URLLoader从重定向的呼叫获取数据,然后分析它连成一个画面的xD

2

您可以使用URLLoader和加载图像为ByteArray。无论重定向如何,这似乎都可以工作。然后,您可以使用ByteArray作为Image/BitmapImage的源代码,或使用Loader加载字节,因为您首先需要映像url。

例如:

var urlRequest:URLRequest = new URLRequest("http://graph.facebook.com/id/picture"); 
var urlLoader:URLLoader = new URLLoader(); 
urlLoader.dataFormat = URLLoaderDataFormat.BINARY; 
urlLoader.addEventListener(Event.COMPLETE, completeHandler); 
urlLoader.load(urlRequest);     

function completeHandler(event:Event):void 
{ 
    var byteArray:ByteArray = loader.data; 

    // Then either: 
    bitmapImage.source = byteArray; 

    // or: 
    var loader:Loader = new Loader(); 
    ... 
    loader.loadBytes(byteArray); 
    ... 
} 
0

我用两个电话的loadPolicyFile,因为它似乎有称Facebook使用2级可能的CDN。这是为我工作,但当然,一个通用的解决方案是优选的,脸谱可能会再次增加另一个CDN和事情会只停留在自己的工作 -

Security.loadPolicyFile('http://profile.ak.fbcdn.net/crossdomain.xml'); 
Security.loadPolicyFile('http://profile.cc.fbcdn.net/crossdomain.xml'); 

通过@Stiggler提出的解决方案的URLLoader可能会奏效。我没有尝试。但是与使用Loader对象相比,它看起来更重。

0

因为有很多领域,其中Facebook的存储它的照片,我写的是使用图像的域加载适当的政策文件中的小脚本:

import com.adobe.net.URI; 
import flash.system.Security; 

var someFacebookImageUrl:String = "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash3/c66.66.828.828/s160x160/537210_440478782684964_233907781_n.jpg"; 
var uri:URI = new URI(someFacebookImageUrl); 
Security.loadPolicyFile(uri.scheme + "://" + uri.authority + "/crossdomain.xml"); 

尼斯是,它不仅适用为配置文件图像,但所有图像Facebook使用。

希望这有助于一些你!

PS:URI类是as3核心库的一部分:http://code.google.com/p/as3corelib/

+0

这是不安全的,如果没有进一步的工作,将导致为每个图像请求提供crossdomain.xml。我认为Facebook应该通过API提供CDN域名列表:http://facebook.stackoverflow.com/a/16629923/383839 – kixorz 2013-05-18 23:30:12