尝试从Flex与Twitter通信时出现安全性错误

时间:2010-10-09 18:26:18

标签: flex security

当我尝试从Twitter请求令牌时:

                _consumer = new OAuthConsumer( _consumerKey, _consumerSecret );
                var oauthRequest:OAuthRequest = new OAuthRequest( "GET", AppConstants.TWITTER_REQUEST_TOKEN_URL, null, _consumer, null );
                var request:URLRequest = new URLRequest( oauthRequest.buildRequest( _signature ) );
                var loader:URLLoader = new URLLoader(   );
                loader.dataFormat = URLLoaderDataFormat.TEXT;  
                loader.addEventListener( Event.COMPLETE, requestTokenHandler );
                loader.load(request);

我收到以下安全错误:

Security ERROR: [SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048: Security sandbox violation: http://localhost:3000/bin/testsite.swf cannot load data from http://twitter.com/oauth/request_token?oauth_consumer_key=....."]

虽然我已添加以下内容:

            Security.allowDomain("*");
            Security.loadPolicyFile("http://twitter.com/crossdomain.xml");

奇怪的是,当我在调试模式下运行我的应用程序(从Flash Builder)时它不会发生,当我从localhot:3000调用我的应用程序时(因为我正在使用Rails),它就会发生!

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我不相信Twitter的跨域政策允许任何域向其发出请求。在这种情况下,您将需要使用服务器代理,如mod_proxy或BlazeDS。

答案 1 :(得分:2)

你走在正确的轨道上。与许多其他Web服务一样,此处的问题是crossdomain.xml不够宽松。 Twitter的crossdomain.xml和任何没有crossdomain.xml文件的域都是如此。

这是Twitter's crossdomain.xml

  

< cross-domain-policy xsi:noNamespaceSchemaLocation =“http://www.adobe.com/xml/schemas/PolicyFile.xsd”>

     

< allow-access-from domain =“twitter.com”/>
  < allow-access-from domain =“api.twitter.com”/>
  < allow-access-from domain =“search.twitter.com”/>
  < allow-access-from domain =“static.twitter.com”/>

     

< site-control allowed-cross-domain-policies =“master-only”/>

     

< allow-http-request-headers-from domain =“ .twitter.com”headers =“”secure =“true”/>

     

< /交叉域的策略>


如果您有权访问twitter.com上的任何内容,则必须从allow-access-from中列出的某个域加载您的swf。由于您可能没有从api.twitter.com加载您的swf,因此您需要从您控制的域后面的服务器代理您对Twitter API的调用。从本质上讲,您将使用服务器端语言(如PHP)编写大部分代码,并从swf中调用它。

调试时一切正常的原因是因为直接从本地文件系统(而不是从本地或远程服务器)加载swf时没有沙箱安全性。

查看whitepaper on Flash securitycrossdomain spec了解更多详情。