flex - فليكس 3 - كيفية دعم مصادقة هتب أورلركست؟





actionscript base64 http-authentication urlrequest (9)


لا تدعم أساليب FileReference.upload () و FileReference.download () المعلمة URLRequest.requestHeaders.

http://livedocs.adobe.com/flex/2/langref/flash/net/URLRequest.html

لدي ملف نصي لتحميل ملف فليكس يستخدم أورلركست لتحميل الملفات إلى خادم. أريد أن أضيف الدعم لمصادقة هتب (الدلائل المحمية بكلمة مرور على الخادم)، ولكن لا أعرف كيفية تنفيذ هذا - أفترض أنني بحاجة إلى تمديد الطبقة بطريقة أو بأخرى، ولكن على كيفية أنا قليلا فقدت.

حاولت تعديل ما يلي (استبدال هتبسرفيس مع ورلركست)، ولكن هذا لم ينجح.

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

أود أن أشير إلى أنني لست على دراية عندما يتعلق الأمر أكتيونسكريبت / فليكس، على الرغم من أنني تمكنت من تعديل بنجاح تحميل البرنامج النصي إلى حد ما.

[تحرير] - هنا هو تحديث التقدم المحرز بلدي، استنادا إلى الجواب أدناه، على الرغم من أنني ما زلت لا يمكن الحصول على هذا العمل:

شكرا لمساعدتك. لقد حاولت تنفيذ التعليمات البرمجية ولكن لم يكن لدي أي حظ.

السلوك العام الذي أتعرض له عند التعامل مع مواقع هتب المصادقة هو أنه مع IE7 كل شيء بشكل جيد ولكن في فايرفوكس عندما أحاول تحميل ملف إلى الخادم فإنه يعرض مطالبة مصادقة هتب - التي حتى لو أعطيت التفاصيل الصحيحة، ببساطة الأكشاك عملية التحميل.

وأعتقد أن السبب IE7 هو موافق وصولا إلى المعلومات جلسة / المصادقة التي تتم مشاركتها من قبل المتصفح ومكون فلاش - ومع ذلك، في فايرفوكس هذا ليس هو الحال وأنا تجربة السلوك أعلاه.

في ما يلي وظيفة التحميل التي تم تحديثها، والتي تتضمن التغييرات التي أجريتها:

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 موجودا - حيث لا يوجد لدي حاليا أحد وأنا غير متأكد من مكان وضعه.




فلاش محدود جدا من حيث أي نوع من الرؤوس يمكنك تمرير مع طلب هتب (ويتغير بين المتصفحات ونظام التشغيل). إذا كنت تحصل على هذا للعمل على متصفح واحد / نظام التشغيل، تأكد من اختباره على الآخرين.

أفضل شيء يجب القيام به هو عدم الفوضى مع رؤوس هتب.

لدينا نفس المشكلة (تحميل إلى ألبومات الويب بيكاسا من فلاش) ونشرها من خلال وكيل على الخادم لدينا. نحن تمرير رؤوس إضافية من خلال معلمات آخر وبروكسي لدينا يفعل الشيء الصحيح.




هنا هو العمل حول عند استخدام ASP.Net في جزء منه على العمل هنا .

لقد بنيت مكونا حيويا يكتب كائنات فليكس للصفحة بحيث يمكن استخدامها في أوبديتبانيلز. رسالة لي إذا كنت تريد أنها رمز. لحل المشكلة أعلاه في الصفحات التي تحتاج إلى إرسال ملفات تعريف الارتباط المصادقة من قبل أورلركست، أضيف القيم في فلاشفارس.

هذا الرمز يعمل فقط في كائن بلدي، ولكن تحصل على هذه الفكرة

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 بيجينركست

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 ساعات قضيت للتو معالجة هذا. لقد أغلقت أدوب هذه المشكلة باعتبارها غير قابلة للحل، لذلك كان هذا هو الملاذ الأخير.




إذا كنت ترغب في تحميل ملف، تحتاج فقط إلى إرسال الرؤوس الصحيحة ومحتوى الملف باستخدام أورلركست عبر فئة أوبلوادبوستهيلبر. هذا يعمل 100٪، وأنا باستخدام هذه الفئة لتحميل الصور ولدت وملفات كسف، ولكن هل يمكن تحميل أي نوع من الملفات.

هذه الفئة ببساطة يعد الطلب مع الرؤوس والمحتوى كما لو كنت تحميل الملف من شكل هتمل.

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



تم حل مشكلة مماثلة على ما يبدو هنا . وأحثكم أيضا على التحقق من وظيفة فليكسكوديرس المرتبطة في أول وظيفة.

وكانت المشكلة أن فايرفوكس يستخدم مثيل نافذة متصفح منفصلة لإرسال طلب تحميل الملف. الحل هو إرفاق معرف الجلسة يدويا إلى عنوان ورل للطلب. لا يتم إرفاق معرف جلسة كمتغير جيت العادية، ولكن مع فاصلة منقوطة (السبب في هذه البنية غير معروف بالنسبة لي).










بناء الجملة يختلف قليلا عن أورلركست، ولكن الفكرة هي نفسها:

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

هناك أمران يجب أخذهما في الاعتبار:

  • أفضل أستطيع أن أقول، لسبب ما، وهذا يعمل فقط حيث طلب الأسلوب هو آخر. لا يتم تعيين الرؤوس مع طلبات جيت.

  • ومن المثير للاهتمام، فإنه يفشل أيضا ما لم يحصل على واحد على الأقل ورلفاريابلز اسم زوج قيمة معبأة مع الطلب، كما هو مبين أعلاه. هذا هو السبب في العديد من الأمثلة التي ترى هناك (بما في ذلك الألغام) إرفاق "نيم = جون + دو" - انها مجرد عنصر نائب لبعض البيانات التي ورلركست يبدو أن تتطلب عند تعيين أي رؤوس هتب مخصصة. وبدون ذلك، سوف تفشل أيضا حتى طلب بوست مصادق بشكل صحيح.

  • على ما يبدو، مشغل فلاش الإصدار 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> 

... ويبدو أن العمل؛ مزيد من المعلومات عن هذا واحد هو متاح من أدوبي هنا ).

تم اختبار الكود أعلاه مع مشغل فلاش 10 (مع التصحيح والتحرير سوف سوف)، لذلك يجب أن تعمل بالنسبة لك، ولكن أردت تحديث آخر الأصلي ليشمل كل هذه المعلومات الإضافية في حال واجهت أي مشاكل، كما يبدو أن فرص (للأسف) على الأرجح أنك سوف.

نأمل أن يساعد! حظا طيبا وفقك الله. سوف نراقب للتعليقات.




كما يقول Documentation : "القيمة الافتراضية للإزاحة هي -1 ، والتي تعيد ضبط سلوك التحويل إلى الوضع القياسي. في هذا الوضع ، يحدد الخادم نقطة انتقال جيدة بين التدفقات إلى الأمام في الوقت المناسب من النقطة التي يتلقاها مكالمة التبديل ، و مفاتيح عند هذه النقطة. "

لذا عليك تغيير معلمة "offset" إلى قيمة أعلى من وقت التشغيل الحالي (Netstream.time). إذا كانت القيمة أقل ، يتم إرسال حدث حالة NetStream.Play.Failed.





flex actionscript base64 http-authentication urlrequest