Flex 3 - 如何支持HTTP身份验证URLRequest?

Bry*_*ynJ 10 apache-flex base64 actionscript urlrequest http-authentication

我有一个Flex文件上传脚本,它使用URLRequest将文件上传到服务器.我想添加对http身份验证(服务器上受密码保护的目录)的支持,但我不知道如何实现这一点 - 我假设我需要以某种方式扩展类,但是如何让我有点迷失.

我试图修改以下内容(用URLRequest替换HTTPService),但这不起作用.

private function authAndSend(service:HTTPService):void{        
   var encoder:Base64Encoder = new Base64Encoder();        
   encoder.encode("someusername:somepassword");        
   service.headers = {Authorization:"Basic " + encoder.toString()};
   service.send();
}
Run Code Online (Sandbox Code Playgroud)

我应该指出,在ActionScript/Flex方面我并不知情,尽管我已经设法成功地修改了上传脚本.

[编辑] - 根据下面的答案,这里是我的进度的更新,虽然我仍然无法让这个工作:

谢谢您的帮助.我试图实现你的代码,但我没有运气.

我在处理HTTP身份验证位置时遇到的一般行为是,IE7一切都很好,但在Firefox中,当我尝试将文件上传到服务器时,它会显示一个HTTP身份验证提示 - 即使给出了正确的详细信息,也只是停顿上传过程.

我相信IE7正常的原因在于浏览器和Flash组件共享的会话/身份验证信息 - 但是,在Firefox中并非如此,我遇到了上述行为.

这是我更新的上传功能,包含您的更改:

private function pergress():void 
{
if (fileCollection.length == 0) 
  {
  var urlString:String = "upload_process.php?folder="+folderId+"&type="+uploadType+"&feid="+formElementId+"&filetotal="+fileTotal;
  if (ExternalInterface.available) 
    {
    ExternalInterface.call("uploadComplete", urlString);
    }
  }
if (fileCollection.length > 0) 
  {
  fileTotal++;
  var urlRequest:URLRequest = new URLRequest("upload_file.php?folder="+folderId+"&type="+uploadType+"&feid="+formElementId+"&obfuscate="+obfuscateHash+"&sessidpass="+sessionPass);
  urlRequest.method = URLRequestMethod.POST;
  urlRequest.data = new URLVariables("name=Bryn+Jones");
  var encoder:Base64Encoder = new Base64Encoder();
  encoder.encode("testuser:testpass");
  var credsHeader:URLRequestHeader = new URLRequestHeader("Authorization", "Basic " + encoder.toString());
  urlRequest.requestHeaders.push(credsHeader);

  file = FileReference(fileCollection.getItemAt(0));
  file.addEventListener(Event.COMPLETE, completeHandler);
  file.addEventListener(HTTPStatusEvent.HTTP_STATUS, onHTTPStatus);
  file.addEventListener(ProgressEvent.PROGRESS, onUploadProgress);
  file.upload(urlRequest);
  }
}
Run Code Online (Sandbox Code Playgroud)

如上所述,无论是否修改我的功能,我似乎都会遇到相同的结果.

我还可以问一下crossdomain.xml应该位于何处 - 因为我目前没有,并且我不确定将它放在何处.

Chr*_*ato 19

URLRequest的语法略有不同,但想法是一样的:

private function doWork():void
{
    var req:URLRequest = new URLRequest("http://yoursite.com/yourservice.ext");
    req.method = URLRequestMethod.POST;
    req.data = new URLVariables("name=John+Doe");

    var encoder:Base64Encoder = new Base64Encoder();        
    encoder.encode("yourusername:yourpassword");

    var credsHeader:URLRequestHeader = new URLRequestHeader("Authorization", "Basic " + encoder.toString());
    req.requestHeaders.push(credsHeader);

    var loader:URLLoader = new URLLoader();
    loader.load(req);
}
Run Code Online (Sandbox Code Playgroud)

要记住以下几点:

  • 最好我可以告诉,由于某种原因,这只适用于请求方法是POST的情况; 标头不会被GET请求设置.

  • 有趣的是,除非至少有一个URLVariables名称 - 值对与请求打包在一起,否则它也会失败,如上所示.这就是为什么你在那里看到的许多例子(包括我的)附加了"name = John + Doe" - 它只是一个占位符,表示URLRequest在设置任何自定义HTTP头时似乎需要的一些数据.没有它,即使经过适当身份验证的POST请求也会失败.

  • 显然,Flash播放器版本9.0.115.0完全阻止了所有授权标题(这里有关于此标题的更多信息),因此您可能也想要记住这一点.

  • 您几乎肯定必须修改您的crossdomain.xml文件以容纳您将要发送的标头.在我的情况下,我正在使用它,这是一个相当开放的策略文件,因为它接受来自任何域,所以在你的情况下,你可能想要限制更多的东西,这取决于你的安全意识.

crossdomain.xml的:

<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*" />
    <allow-http-request-headers-from domain="*" headers="Authorization" />
</cross-domain-policy> 
Run Code Online (Sandbox Code Playgroud)

......这似乎有效; 在这一个更多的信息可从Adobe 这里).

上面的代码是使用Flash播放器10(带有调试和发布SWF)测试的,所以它应该适合你,但我想更新我原来的帖子,以包含所有这些额外的信息,以防你遇到任何问题,因为机会似乎(遗憾的是)你很可能.

希望能帮助到你!祝好运.我会留意评论.