OpenLayers 2.12 और http बुनियादी प्रमाणीकरण मुसीबतों


13

मैं एक सर्वर से WMS परतों को प्रदर्शित करने के लिए OpenLayers 2.12 का उपयोग करने का प्रयास कर रहा हूं जिसमें HTTP बेसिक प्रमाणीकरण सक्षम है।

मैंने अपने जावास्क्रिप्ट कोड में URL पैरामीटर में उपयोगकर्ता नाम और पासवर्ड डालकर प्रमाणीकरण को संभालने का प्रयास किया है। उदाहरण परत निर्माण:

myLayer = new OpenLayers.Layer.WMS('background',
        'https://username:password@ws.nls.fi/rasteriaineistot/image?',
        {
            layers: 'background',
            bbox: '-380188,6249943,1347312,8226943'
        },                                   
        {
            displayInLayerSwitcher: true,
            isBaseLayer: false,
            projection: 'EPSG:3067',
            visibility: true
        });

बेशक यह सुरक्षित नहीं है क्योंकि क्रेडेंशियल्स जावास्क्रिप्ट कोड में संग्रहीत हैं और सभी ब्राउज़रों में काम नहीं करते हैं। Internet Explorer 8 OpenLayers.js को इंगित करने में सुरक्षा त्रुटि देता है और मानचित्र को प्रदर्शित करने से इनकार करता है। फ़ायरफ़ॉक्स 13 कुछ प्रमाणीकरण संवादों को पॉप अप करता है जिन्हें मैं रद्द कर सकता हूं (इसके बाद मानचित्र सही ढंग से प्रदर्शित होता है)। Chrome 23 में प्रमाणीकरण त्रुटिपूर्ण रूप से काम करता है।

क्या आप इस बात की पुष्टि कर सकते हैं कि URL में एन्कोडिंग करके और उदाहरण में OpenLayers को देकर HTTP बेसिक ऑथेंटिकेशन को क्रॉस-ब्राउज़र तरीके से हैंडल करना संभव नहीं है?

क्या आप HTTP मूल प्रमाणीकरण को संभालने के लिए वैकल्पिक तरीके सुझा सकते हैं ताकि यह उपयोगकर्ता के लिए पारदर्शी रूप से काम करे (कोई प्रमाणीकरण पॉपअप प्रदर्शित नहीं हो)? शायद इसके आसपास काम करने के लिए किसी तरह के प्रॉक्सी सर्वर का उपयोग करें।


2
आप एक प्रॉक्सी का उपयोग कर सकते हैं - docs.openlayers.org/library/request.html प्रॉक्सी उदाहरण> collab.itc.virginia.edu/wiki/toolbox/...
Mapperz

जहाँ तक मुझे पता है, OpenLayers में प्रमाणीकरण से निपटने का एकमात्र तरीका OpenLayers.Request.issue () ( goo.gl/OKtGj ) फ़ंक्शन का उपयोग कर रहा है , जो आपकी आवश्यकताओं के अनुरूप नहीं है।
दरियाप्रा

iluwatar> क्या आपने कभी इस मुद्दे को अतीत में बताया कि फायरफॉक्स एक लॉगिन प्रमाणीकरण दिखाता है? जैसा कि आप लिखते हैं, आप बस पॉपअप पर रद्द दबा सकते हैं, लेकिन यह प्रमाणीकरण पॉपअप के साथ अंतिम उपयोगकर्ता के लिए परेशान और भ्रमित है।
15

जवाबों:


7

हमने जिस समाधान को समाप्त किया, वह था ओपनलाइयर्स क्लाइंट और बैकएंड WMS सेवा के बीच एक प्रामाणिक प्रॉक्सी सर्वर जोड़ना। इसलिए WMS सेवा से सीधे जुड़ने के बजाय OpenLayers क्लाइंट एक प्रॉक्सी सर्वर से जुड़ता है जो अनुरोधों के लिए आवश्यक प्रमाणीकरण हेडर जोड़ता है।

परतों को बनाने के लिए उदाहरण कोड:

var layer = new OpenLayers.Layer.WMS( "background", "http://myproxyaddress.com/23ergwe435dw3463", {layers: 'basic'} );

उदाहरण अपाचे प्रॉक्सी विन्यास:

ProxyRequests     Off
ProxyPreserveHost On
SSLProxyEngine On
<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>
SetEnvIf Request_URI "23ergwe435dw3463" wms_provider_name
RequestHeader set Authorization: "Basic Xk12BLdVNzUo5UGl0po5Y" env=wms_provider_name
ProxyPass         /23ergwe435dw3463  https://wmsprovideraddress.com
ProxyPassReverse  /23ergwe435dw3463  https://wmsprovideraddress.com

इस शैली का उपयोग करके आपके पास कई प्रॉक्सी कॉन्फ़िगरेशन हो सकते हैं।

आपको प्राधिकरण उद्धरणों के अंदर जो कुछ भी डाला जाना चाहिए, वह स्ट्रिंग "उपयोगकर्ता नाम: पासवर्ड" (बिना उद्धरण के) का आधार -64 कूटबन्धन मात्र है। अधिक जानकारी के लिए इस लिंक को देखें: /programming/567814/apache2-reverse-proxy-to-an-end-point-that-requires-basicauth-but-want-to-hide-t


5

नक्शे में परत जोड़ने से पहले आप एक नकली अजाक्स अनुरोध भेज सकते हैं। ब्राउज़र आपके लिए मूल प्रमाणीकरण को संभाल लेगा:

// Assuming myLayer **WITHOUT** user:pass in the url
$.ajax({
    url: myLayer.url,
    data: myLayer.params,
    method: 'GET',
    error: function(jqXHR, textStatus, errorThrown){
        // Handle not authoruzed here
    },
    success: function(){
        // Yuppieeeeee!
        map.addLayer(myLayer);    // The browser wil set up the 
                                  // authentication in the request for you
    }

});

यह तभी काम करेगा जब सर्वर 401 - ऑर्गेनिक आवश्यक हेडर लौटाता है (जियोसर्वर में आपको चुनौती या मिश्रित करने के लिए सुरक्षा नीति सेट करनी होगी)


Ajax call id को jQuery का उपयोग करके किया जाता है ...
टॉमसो

मुझे यह जानकर अच्छा लगेगा कि वास्तव में मुझे वह स्थान कहां चाहिए। अपने प्रोजेक्ट में मैं जियोएक्स्ट 2, एक्सटीजेएस 4.2 और ओपन लाइयर्स 2.12 का उपयोग कर रहा हूं।
g07kore

मुझे लगता है कि यह मेरे मामले में काम कर सकता है। लेकिन क्या आपके पास कोई सुझाव है कि मैं एक नकली अनुरोध कैसे भेज सकता हूं? एटीएम मैं लॉगिन पॉपअप को ट्रिगर करने के अनुरोध के लिंक के साथ एक href का उपयोग करता हूं, लेकिन मैं लिंक पर नेविगेट नहीं करना चाहता।
ज्योग्रैब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.