Flex 3- HTTP 인증 URLRequest를 지원하는 방법은 무엇입니까?
-
21-08-2019 - |
문제
urlRequest를 사용하여 서버에 파일을 업로드하는 Flex 파일 업로드 스크립트가 있습니다. HTTP 인증 (서버의 비밀번호 보호 디렉토리)에 대한 지원을 추가하고 싶지만 이것을 구현하는 방법을 모르겠습니다. 어떻게 든 클래스를 확장해야한다고 생각하지만 약간 길을 잃은 방법에 대해 생각합니다.
다음을 수정하려고 시도했지만 (httpservice를 urlrequest로 바꾸었지만) 작동하지 않았습니다.
private function authAndSend(service:HTTPService):void{
var encoder:Base64Encoder = new Base64Encoder();
encoder.encode("someusername:somepassword");
service.headers = {Authorization:"Basic " + encoder.toString()};
service.send();
}
ActionScript / Flex와 관련하여 지식이 없다는 것을 지적해야하지만 업로드 스크립트를 약간 수정했지만 다소 수정되었습니다.
편집하다 - 아래 답변을 바탕으로 진행 상황에 대한 업데이트가 있습니다.
도와 주셔서 감사합니다. 코드를 구현하려고했지만 운이 없었습니다.
HTTP 인증 된 위치를 다룰 때 경험하고있는 일반적인 행동은 IE7을 사용하면 모든 것이 좋지만 파일을 서버에 업로드하려고 할 때 Firefox에서는 HTTP 인증 프롬프트가 표시됩니다. 업로드 프로세스.
IE7이 괜찮은 이유는 브라우저와 플래시 구성 요소가 공유하는 세션 / 인증 정보에 달려 있다고 생각합니다. 그러나 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);
}
}
위에서 언급했듯이, 나는 내 기능에 대한 수정 유무에 관계없이 동일한 결과를 겪고있는 것 같습니다.
CrossDomain.xml이 어디에 있는지 물어볼 수 있습니까?
해결책
구문은 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);
}
명심해야 할 몇 가지 사항 :
어떤 이유로 든 이것은 요청 방법이 게시되는 곳에서만 작동합니다. GET 요청으로 헤더가 설정되지 않습니다.
흥미롭게도, 위에 표시된 것처럼 하나 이상의 urlvaribles name-value 쌍이 요청과 함께 포장되지 않는 한 실패합니다. 그렇기 때문에 당신이 볼 수있는 많은 예제 (광산 포함)가 "name = john+doe"를 첨부하는 이유입니다. 사용자 정의 HTTP 헤더를 설정할 때 UrlRequest가 요구하는 일부 데이터의 자리 표시 자일뿐입니다. 그것 없이는 제대로 인증 된 사후 요청조차 실패합니다.
분명히 플래시 플레이어 버전 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>
... 그리고 그것은 작동하는 것 같습니다. 이 정보에 대한 자세한 내용은 Adobe에서 제공됩니다 여기).
위의 코드는 Flash Player 10 (Debug & Release SWFS 포함)으로 테스트되었으므로 작동해야하지만 가능성이있는 경우이 추가 정보를 포함시키기 위해 원래 게시물을 업데이트하고 싶었습니다. (슬프게도) 당신이 할 가능성이 높습니다.
도움이되기를 바랍니다! 행운을 빕니다. 나는 의견을 주시 할 것이다.
다른 팁
filEerference.upload () 및 filereference.download () 메소드는 urlrequest.requestheaders 매개 변수를 지원하지 않습니다.
http://livedocs.adobe.com/flex/2/langref/flash/net/urlrequest.html
파일을 업로드하려면 UploadPosthelper 클래스를 통해 UrlRequest를 사용하여 올바른 헤더와 파일 내용을 보내면됩니다. 이것은 100%작동합니다.이 클래스를 사용하여 생성 된 이미지 및 CSV 파일을 업로드하지만 모든 종류의 파일을 업로드 할 수 있습니다.
이 클래스는 HTML 양식에서 파일을 업로드하는 것처럼 헤더 및 컨텐츠로 요청을 준비합니다.
http://code.google.com/p/asclublib/source/browse/trunk/net/uploadposthelper.as?r=118
_urlRequest = new URLRequest(url);
_urlRequest.data = "LoG";
_urlRequest.method = URLRequestMethod.POST;
_urlRequest.requestHeaders.push(new URLRequestHeader("X-HTTP-Code-Override", "true"));
_urlRequest.requestHeaders.push(new URLRequestHeader("pragma", "no-cache"));
initCredentials();
_loader.dataFormat = URLLoaderDataFormat.BINARY;
//this creates a security problem, putting the content type in the headers bypasses this problem
//_urlRequest.contentType = 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary();
_urlRequest.requestHeaders.push( new URLRequestHeader( 'Cache-Control', 'no-cache' ) );
_urlRequest.requestHeaders.push(new URLRequestHeader('Content-Type', 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary()));
_urlRequest.data = UploadPostHelper.getPostData("file.csv", param[1]);
_loader.load(_urlRequest);
확실하지 않지만 URL의 시작 부분에 사용자 이름 : password@을 추가해 보셨습니까?
"http : // username : password@yoursite.com/yourservice.ext"
var service : HTTPService = new HTTPService ();
var encoder:Base64Encoder = new Base64Encoder();
encoder.insertNewLines = false;
encoder.encode("user:password");
service.headers = {Authorization:"Basic " + encoder.toString()};
service.method = HTTPRequestMessage.POST_METHOD;
service.request = new URLVariables("name=John+Doe");
service.addEventListener(FaultEvent.FAULT,error_handler );
service.addEventListener(ResultEvent.RESULT,result_handler);
service.url = 'http://blah.blah.xml?'+UIDUtil.createUID();
service.send();
겉보기에는 비슷한 문제가 해결되었습니다 여기. 나는 또한 당신에게도 확인할 것을 촉구합니다 FlexCoders 게시물 첫 번째 게시물에서 링크.
문제 Firefox는 별도의 브라우저 창 인스턴스를 사용하여 파일 업로드 요청을 보냅니다. 해결책 세션 ID를 요청 URL에 수동으로 첨부하는 것입니다. 세션 ID는 정기적 인 GET 변수로 첨부되지 않지만 세미콜론이 있습니다 (이 구문의 이유는 나에게 알려져 있지 않음).
Flash는 HTTP 요청으로 전달할 수있는 종류의 헤더와 관련하여 매우 제한적입니다 (브라우저와 OS간에 변경). 하나의 브라우저/OS에서 작동하도록하는 경우 다른 브라우저/OS에서 테스트해야합니다.
가장 좋은 방법은 HTTP 헤더를 엉망으로 만들지 않는 것입니다.
우리는 동일한 문제 (Flash에서 Picasa 웹 앨범에 업로드)를 가지고 있으며 서버의 프록시를 통해 게시합니다. 우리는 포스트 매개 변수로 추가 헤더를 통과시키고 프록시는 올바른 일을합니다.
"http : // username : password@yoursite.com/yourservice.ext"
이것은 IE에서 작동하지 않습니다 (http://www.theeregister.co.uk/2004/01/30/ms_drop_authentication_technique/) 그리고 크롬에서도 작동하지 않는 것 같습니다.
아마도 플래시에서 사용할 수 없을 것입니다
작업에 부분적으로 ASP.NET을 사용할 때의 작업은 다음과 같습니다. 여기.
Flex 객체를 페이지에 동적으로 쓸 수있는 구성 요소를 만들어 업데이트 패널에서 사용할 수 있습니다. 그들이 코드를 원한다면 저에게 메시지를 보내십시오. UrlRequest가 인증 쿠키를 보내야하는 페이지에서 위의 문제를 해결하려면 FlashVars의 값을 추가합니다.
이 코드는 내 객체에서만 작동하지만 아이디어를 얻습니다.
Dictionary<string, string> flashVars = new Dictionary<string, string>();
flashVars.Add("auth", Request.Cookies["LOOKINGGLASSFORMSAUTH"].Value);
flashVars.Add("sess", Request.Cookies["ASP.NET_SessionId"].Value);
myFlexObject.SetFlashVars(flashVars);
그런 다음 플렉스 객체에서 매개 변수를 확인하십시오.
if (Application.application.parameters.sess != null)
sendVars.sess= Application.application.parameters.sess;
if (Application.application.parameters.auth != null)
sendVars.au= Application.application.parameters.auth;
request.data = sendVars;
request.url = url;
request.method = URLRequestMethod.POST;
마지막으로 쿠키를 Global.asax Beginrequest에 넣습니다
if (Request.RequestType=="POST" && Request.Path.EndsWith("upload.aspx"))
{
try
{
string session_param_name = "sess";
string session_cookie_name = "ASP.NET_SESSIONID";
string session_value = Request.Form[session_param_name]; // ?? Request.QueryString[session_param_name];
if (session_value != null) { UpdateCookie(session_cookie_name, session_value); }
}
catch (Exception) { }
try
{
string auth_param_name = "au";
string auth_cookie_name = FormsAuthentication.FormsCookieName;
string auth_value = Request.Form[auth_param_name];// ?? Request.QueryString[auth_param_name];
if (auth_value != null) { UpdateCookie(auth_cookie_name, auth_value); }
}
catch (Exception) { }
}
이것이 누군가 내가 이것을 해결하는 데 소비 한 6 시간을 피하는 데 도움이되기를 바랍니다. Adobe는 문제를 해결할 수없는 것으로 닫았으므로 이것이 나의 마지막 수단이었습니다.