flex फ्लेक्स 3-HTTP प्रमाणीकरण URLRequest का समर्थन कैसे करें?




actionscript base64 (8)

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();

मेरे पास एक फ्लेक्स फाइल अपलोड स्क्रिप्ट है जो किसी सर्वर पर फाइल अपलोड करने के लिए 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();
}

मुझे कहना चाहिए कि एक्शन स्क्रिप्ट / फ्लेक्स की बात आती है कि मैं जानकार नहीं हूं, हालांकि मैं अपलोड स्क्रिप्ट को कुछ हद तक सफलतापूर्वक संशोधित करने में कामयाब रहा हूं।

[संपादित करें] - नीचे दिए गए उत्तर के आधार पर यहां मेरी प्रगति का एक अपडेट है, हालांकि मुझे यह काम करने के लिए नहीं मिल सकता है:

तुम्हारे सहयोग के लिए तुम्हे धन्यवाद। मैंने आपके कोड को लागू करने की कोशिश की है लेकिन मेरे पास कोई भाग्य नहीं है

HTTP प्रमाणीकृत स्थानों के साथ काम करते समय सामान्य व्यवहार मैं अनुभव कर रहा हूं कि आईई 7 के साथ सब ठीक है, लेकिन फ़ायरफ़ॉक्स में जब मैं एक फ़ाइल को सर्वर पर अपलोड करने का प्रयास करता हूं तो यह एक HTTP प्रमाणीकरण संकेत प्रदर्शित करता है - जो यहां तक ​​कि सही विवरण दिए गए हैं, बस स्टाल्स अपलोड की प्रक्रिया

मेरा मानना ​​है कि कारण आईई 7 ठीक है, सत्र / प्रमाणीकरण जानकारी ब्राउज़र और फ्लैश घटक द्वारा साझा किया जा रहा है - हालांकि, फ़ायरफ़ॉक्स में यह मामला नहीं है और मैं उपरोक्त व्यवहार का अनुभव करता हूं।

यहां मेरा अपडेट अपलोड फ़ंक्शन है, जिसमें आपके परिवर्तन शामिल हैं:

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 कहाँ स्थित होना चाहिए - जैसा कि मेरे पास वर्तमान में एक नहीं है और यह अनिश्चित है कि इसे कहाँ रखना चाहिए


यहां काम पर भाग के आधार पर एएसपी.नेट का इस्तेमाल करते समय एक काम है

मैंने उस घटक का निर्माण किया है जो कि गतिशील रूप से फ्लेक्स ऑब्जेक्ट्स को पेज पर लिखते हैं ताकि वे UpdatePanels में उपयोग किए जा सकें। मुझे संदेश भेजें यदि आप चाहते हैं कि वे कोड उपरोक्त समस्या को उन पृष्ठों में हल करने के लिए जहां प्रमाणीकरण कुकीज 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;

अंत में कुकीज़ को वैश्विक पर लाता है

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 घंटे से बचने में मदद करता है, जिसने मुझे बस इस पते पर खर्च किया था। एडोब ने इस समस्या को अनारोलवयबल के रूप में बंद कर दिया है, इसलिए यह मेरा अंतिम उपाय था।




वाक्यविन्यास 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);
}

कुछ चीजों को ध्यान में रखने के लिए:

  • सबसे अच्छा मैं बता सकता हूं, किसी कारण से, यह केवल उस कार्य करता है जहां अनुरोध विधि पोस्ट होती है; हेडर प्राप्त अनुरोधों के साथ सेट नहीं करते हैं

  • दिलचस्प रूप से, यह भी विफल हो जाता है जब तक कम से कम एक URLVariables नाम-मूल्य जोड़ी अनुरोध के साथ पैक किया जाता है, जैसा कि ऊपर बताया गया है। यही कारण है कि आप जिन उदाहरणों को देख रहे हैं (मेरा भी शामिल है) "नाम = जॉन + डो" संलग्न करें - यह कुछ डेटा के लिए केवल एक प्लेसहोल्डर है जो URLRequest की आवश्यकता होती है जब कोई भी कस्टम HTTP शीर्षलेख सेट करना पड़ता है इसके बिना, एक उचित प्रमाणीकृत पोस्ट अनुरोध भी विफल हो जाएगा।

  • जाहिर है, फ्लैश प्लेयर संस्करण 9.0.115.0 पूरी तरह से सभी प्राधिकरण शीर्षकों को ब्लॉक करता है ( यहां पर इस पर अधिक जानकारी), इसलिए संभवतः आप इसे ध्यान में रखना चाहते हैं।

  • आपको भेजने वाले होने वाले शीर्षलेख (मैसेज) को समायोजित करने के लिए आपको लगभग अपनी क्रॉसडोमेन.एक्सएम फाइल को संशोधित करना होगा। मेरे मामले में, मैं इसका उपयोग कर रहा हूं, जो कि एक विस्तृत खुली नीति फ़ाइल है, जिसमें वह किसी भी डोमेन से स्वीकार करता है, इसलिए आपके मामले में, आप कितना सुरक्षा-जागरूक हो ।

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 से यहां उपलब्ध है )।

ऊपर दिए गए कोड का परीक्षण फ्लैश प्लेयर 10 (डिबग और रिलीज़ एसडब्ल्यूएफ) के साथ किया गया था, इसलिए इसे आपके लिए काम करना चाहिए, लेकिन मैं अपने मूल पोस्ट को अपडेट करना चाहता हूं ताकि आप सभी मुद्दों को शामिल कर सकें यदि आप किसी भी मुद्दे पर चलते हैं (दुख की बात) संभावना है कि आप करेंगे

आशा करता हूँ की ये काम करेगा! सौभाग्य। मैं टिप्पणियों के लिए एक आँख रखूंगा


फ्लैश आपको एक HTTP अनुरोध (और यह ब्राउज़र और ओएस के बीच में परिवर्तन) के साथ कितने हेडर पास कर सकते हैं के मामले में बहुत सीमित है। यदि आपको यह एक ब्राउज़र / ओएस पर काम करने के लिए मिलता है, तो सुनिश्चित करें कि आप इसे दूसरे पर जांचें।

सबसे अच्छी बात HTTP हेडर के साथ गड़बड़ नहीं है

हमारे पास एक ही समस्या है (फ्लैश से Picasa वेब एल्बम पर अपलोड करना) और हमारे सर्वर पर प्रॉक्सी के माध्यम से पोस्ट करें हम अतिरिक्त मानकों को पोस्ट मापदंडों के माध्यम से पास करते हैं और हमारी प्रॉक्सी सही काम करती है



यदि आप कोई फ़ाइल अपलोड करना चाहते हैं, तो आपको बस UploadPostHelper क्लास के माध्यम से यूआरएलआरएफ़ेस्ट का उपयोग करके सही हेडर और फाइल की सामग्री भेजने की जरूरत है। यह 100% काम करता है, मैं इस वर्ग का उपयोग कर तैयार छवियों और सीएसवी फ़ाइलों को अपलोड करने के लिए कर रहा हूं, लेकिन आप किसी भी तरह की फाइल अपलोड कर सकते हैं।

यह वर्ग केवल हेडर और सामग्री के साथ अनुरोध को तैयार करता है जैसे कि आप फ़ाइल को एक html फॉर्म से अपलोड कर रहे होंगे।

http://code.google.com/p/as3asclublib/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);