Flash不支持URL中的用户名/密码吗?我有什么选择?

时间:2011-10-13 10:32:54

标签: flash actionscript-3

我一直在尝试从一个带有用户名/密码的URL加载一些JSON。

因此网址类似于:http://username:password@www.myaddress.org.uk/api/profiles/

我一直在使用来自greensock的DataLoader类,如果身份验证已启动,则会返回错误#2032:流错误但在禁用时会正常加载。

我正在尝试添加'授权'URLRequestHeader以解决此问题?这是最好的前进方式吗?

如果相关,我正在使用Windows 7 Enterprise上的FlashDevelop 4.0 / Flex SDK 4.5.1进行开发。

提前致谢!

修改

我试图以类似的方式使用标题:Flex 3 - how to support HTTP Authentication URLRequest?但我没有取得多大成功。我正在使用的base64编码器来自:http://jpauclair.net/2010/01/09/base64-optimized-as3-lib/

第二次修改:最新代码

_loader = new DataLoader(ENDPOINT, { onComplete:handleComplete, onError:handleError, onFail:handleFail } );

_loader.request.method = URLRequestMethod.POST;
_loader.request.data = new URLVariables("required=RandomData");

var bytes:ByteArray = new ByteArray();
bytes.writeUTFBytes(USER+':'+PASS);
var headerString:String = Base64.encode(bytes);
var header:URLRequestHeader = new URLRequestHeader('Authorization', 'Basic ' + headerString );
_loader.request.requestHeaders.push(header);

_loader.load();

的crossdomain.xml

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy 
  SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-access-from domain="*" />
   <allow-http-request-headers-from domain="*" headers="Authorization" />
</cross-domain-policy>

编辑3 我也尝试过使用URLLoader:

var urlRequest:URLRequest = new URLRequest(ENDPOINT);
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = new URLVariables("required=RandomData");

var bytes:ByteArray = new ByteArray();
bytes.writeUTFBytes(USER+':'+PASS);
var headerString:String = Base64.encode(bytes);
var header:URLRequestHeader = new URLRequestHeader('Authorization', 'Basic ' + headerString );
urlRequest.requestHeaders.push(header);

_urlLoader = new URLLoader(urlRequest);
_urlLoader.addEventListener(Event.COMPLETE, temp_handleComplete);
_urlLoader.addEventListener(IOErrorEvent.IO_ERROR, temp_handleError);

1 个答案:

答案 0 :(得分:1)

基本身份验证在Flash中受到很大限制,特别是如果您要使用API​​。我建议将请求包装在您自己的服务器上,您可以在其中实现基于会话或基于密钥的身份验证。

EG。 http://api.your-domain.co.uk/api/profiles/?key=0123456789abdef将调用服务器端脚本,1)检查API密钥的有效性,2)从http://username:password@www.myaddress.org.uk/api/profiles/获取数据并将其返回。

如果您使用的不仅仅是API中的“/ api / profiles /”,我建议编写一个可以接受任何路径并获取相应远程路径的重写。该脚本可以是您的服​​务器上支持的任何内容,从php脚本到bash脚本。

或者,如果您的服务器应用程序支持它,您甚至可以使用mod_proxy之类的东西来设置反向代理。实际上,现在我考虑一下,使用Apache或Lighttpd的反向代理可能是最简单的解决方案! (见:http://httpd.apache.org/docs/2.0/mod/mod_proxy.html