flex एडोब फ्लेक्स/एआईआर में HTTPService ऑब्जेक्ट्स के साथ HTTP मूल प्रमाणीकरण




air http-authentication (7)

HTTP मूल प्रमाणीकृत वेबसाइटों का उपभोग करते समय मुझे एक ही समस्या थी। यह मेरा समाधान है; यह बढ़िया काम करता है:

private function authAndSend(service:WebService):void
{
    var encoder:Base64Encoder = new Base64Encoder();
        encoder.insertNewLines = false; 
        encoder.encode("user:password");
    service.httpHeaders = { Authorization:"Basic " + encoder.ToString() };
    service.initialize();
}

प्रयोग

authAndSend(WebService( aWebServiceWrapper.serviceControl));

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

यहां कोड है:

<mx:Script>
    <![CDATA[
        import mx.rpc.events.ResultEvent;
        import mx.rpc.events.FaultEvent;

        private function authAndSend(service:HTTPService):void
        {
            service.setRemoteCredentials('someusername', 'somepassword');
            service.send();
        }

        private function resultHandler(event:ResultEvent):void
        {
            apiResult.text = event.result.toString();
        }

        private function resultFailed(event:FaultEvent):void
        {
            apiResult.text = event.fault.toString();
        }
    ]]>
</mx:Script>

<mx:HTTPService id="apiService"
    url="https://mywebservice.com/someFileThatRequiresBasicAuth.xml"
    resultFormat="text"
    result="resultHandler(event)"
    fault="resultFailed(event)" />

<mx:Button id="apiButton"
    label="Test API Command"
    click="authAndSend(apiService)" />

<mx:TextArea id="apiResult" />

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

कोई काला जादू, ओह फ्लेक्स गुरु? धन्यवाद।

संपादित करें: सेट करने के लिए setRemoteCredentials () को बदलना () निम्नलिखित क्रियाएँ त्रुटि उत्पन्न करता है:

[MessagingError message='Authentication not supported on DirectHTTPChannel (no proxy).']

संपादित करें: एडोब से कुछ ध्यान देने के बाद समस्या हल हो गई। पूर्ण स्पष्टीकरण के लिए नीचे दी गई पोस्ट देखें। यह कोड मनमानी लंबाई के HTTP प्रमाणीकरण शीर्षलेखों के लिए काम करेगा।

import mx.utils.Base64Encoder;
private function authAndSend(service:HTTPService):void
{
        var encoder:Base64Encoder = new Base64Encoder();
        encoder.insertNewLines = false; // see below for why you need to do this
        encoder.encode("someusername:somepassword");

        service.headers = {Authorization:"Basic " + encoder.toString()};                                                
        service.send();
}

सेट क्रेडेंशियल () और setRemoteCredentials () विधियों का उद्देश्य फ्लेक्स / लाइवसाइकल डेटा सेवाओं के उपयोग के लिए है, इसलिए वे शायद आपके मामले में लागू नहीं होते हैं।

यह आपके लिए काम करना चाहिए। मैं अपने सर्वर पर इस व्यवहार को पुन: पेश करने में सक्षम था, और इस फिक्स ने चाल की है; यह अभी भी थोड़ा अजीब लगता है कि यह अधिक एपीआई-उपयोगकर्ता-अनुकूल नहीं है, इस बात पर विचार करते हुए कि आप कितने आम मामले के बारे में सोचते हैं, लेकिन फिर भी, मैंने एक वैध SSL प्रमाण पत्र दिया है, मैंने इन कार्यों का परीक्षण और सत्यापन किया है:

private function authAndSend(service:HTTPService):void
{
        var encoder:Base64Encoder = new Base64Encoder();
        encoder.encode("someusername:somepassword");

        service.headers = {Authorization:"Basic " + encoder.toString()};                            
        service.send();
}

आशा करता हूँ की ये काम करेगा! और पोस्टिंग के लिए धन्यवाद - मुझे यकीन है कि मैं इसे जल्द या बाद में अपने आप में चलाऊंगा। ;)


इसके अलावा, बस इतना ही लोग 10 मिनट खर्च नहीं करते हैं कि क्यों सही उदाहरण एसिस काम नहीं करता है, आपको mx.utils.Base64Encoder पैकेज आयात करने की आवश्यकता है उदाहरण:

        import mx.utils.Base64Encoder;

सीडीएटीए क्षेत्र के भीतर या कहीं भी। मैं फ्लेक्स के लिए नया हूँ इसलिए यह पहले बिल्कुल स्पष्ट नहीं था।


SetRemoteCredentials की बजाय setCredentials का उपयोग करने का प्रयास करें और फ़िलर / चार्ल्स का उपयोग करके यह पता लगाने के लिए कि हेडर को अनुरोध के साथ भेजा जा रहा है।


इस तरह यह किया गया है।

import mx.utils.Base64Encoder;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.http.HTTPService;

var _oHttp:HTTPService = new HTTPService;
var sUsername:String = "theusername"
var sPassword:String = "thepassword";

var oEncoder:Base64Encoder = new Base64Encoder(); 
oEncoder.insertNewLines = false; 
oEncoder.encode(sUsername + ":" + sPassword); 

_oHttp.method = "POST";
_oHttp.headers = {Authorization:"Basic " + oEncoder.toString()}; 

अंततः एडोब से कुछ ध्यान प्राप्त हुआ और इस पर एक जवाब मिला। लंबे HTTP प्रमाणीकरण शीर्षकों के साथ समस्या यह है कि, डिफ़ॉल्ट रूप से, Base64Encoder क्लास प्रत्येक 72 वर्णों के न्यूलाइन वर्णों को इंजेक्ट करेगा। जाहिर है कि आधार -64 एन्कोडेड स्ट्रिंग का एक हिस्सा एक नए शीर्षलेख विशेषता के रूप में व्याख्या करने का कारण बनता है, जो त्रुटि का कारण बनता है।

आप इसे सेट करके (उपर्युक्त उदाहरण में) encoder.insertNewLines = false सेट करके इसे ठीक कर सकते हैं; डिफ़ॉल्ट सेटिंग सच है।

मैंने उपरोक्त कोड को मनमाने ढंग से लंबे प्रमाणीकरण तारों के लिए काम करने के लिए तय कर दिया है।


यह वास्तव में मेरी मदद की है! धन्यवाद! मैं फ्लेक्स बिल्डर 3 का उपयोग करता हूं

एक नोट: वेब सेवा के प्रॉपर्टी हेडर केवल पढ़े जाते हैं। तो मैंने httpHeaders का उपयोग करने की कोशिश की। यह काम करता हैं!

    var encoder:Base64Encoder = new Base64Encoder();
    encoder.insertNewLines = false;
    encoder.encode("test:test");

    sfWS.httpHeaders = {Authorization:"Basic " + encoder.toString()};