当我尝试从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),它就会发生!
有什么想法吗?
答案 0 :(得分:2)
我不相信Twitter的跨域政策允许任何域向其发出请求。在这种情况下,您将需要使用服务器代理,如mod_proxy或BlazeDS。
答案 1 :(得分:2)
你走在正确的轨道上。与许多其他Web服务一样,此处的问题是crossdomain.xml
不够宽松。 Twitter的crossdomain.xml和任何没有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时没有沙箱安全性。