28

के साथ कॉल करता है मेरे पास एक आरईएसटी आधारित सर्वर है जिसे मैं JQuery का उपयोग करने के साथ संवाद करने की कोशिश कर रहा हूं। एक्सएमएल और जेएसओएन दोनों प्रतिक्रिया प्रारूप के रूप में उपलब्ध हैं, इसलिए मैं JSON का उपयोग कर रहा हूं।JQuery अजाक्स HTTP मूल प्रमाणीकरण

कनेक्शन तो बुनियादी HTTP प्रमाणीकरण के सभी SSL पसंद का हमारे प्राधिकरण विधि से किया गया है कर रहे हैं, और हम अन्य सामने समाप्त होता है के साथ कोई समस्या नहीं पड़ा है (कच्चे जावास्क्रिप्ट, सिल्वरलाइट, आदि ...)

अब मैं प्रयास कर रहा हूँ JQuery के साथ कुछ एक साथ रखने और HTTP मूल प्रमाणीकरण का उपयोग कर अंतहीन समस्याओं को रखने के लिए।

मैंने कई पिछले प्रश्नों के माध्यम से खराब किया है जिनमें से अधिकतर समाधान हैं जो वास्तव में काम नहीं करते हैं या क्रॉस मूल पहुंच पर पूरी समस्या को दोष नहीं देते हैं, जिसे मैं पहले से ही मूल जावास्क्रिप्ट परीक्षण में पार कर चुका हूं। प्रतिक्रियाएं हमेशा अनुरोध में प्रदान की गई मूल शीर्षलेख पर Access-Control-Allow-Origin प्रदान करती हैं, और यह मेरे परीक्षणों के जवाब में देखी जा सकती है।

बुनियादी जावास्क्रिप्ट में, इस पूरे कॉल बहुत बस के साथ पूरा किया है:

req.open('GET', 'https://researchdev-vm:8111/card', true, 'test', 'testpassword'); 

इस पर JQuery प्रयास काफी मानक है:

 $.ajax({ 
     username: 'test', 
     password: 'testpassword', 
     url: 'https://researchdev-vm:8111/card', 
     type: 'GET', 
     dataType: 'json', 
     crossDomain: true, 
     /*data: { username: 'test', password: 'testpassword' },*/ 
     beforeSend: function(xhr){ 
      xhr.setRequestHeader("Authorization", 
       //"Basic " + encodeBase64(username + ":" + password)); 
       "Basic AAAAAAAAAAAAAAAAAAA="); 
     }, 
     sucess: function(result) { 
      out('done'); 
     } 
    }); 

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

beforeSend() व्यवहार प्रदान किए जाने के साथ, जीईटी कॉल को शामिल डेटा के साथ सकारात्मक प्रतिक्रिया मिलती है। हालांकि, क्योंकि यह एक क्रॉस साइट कॉल है, जीईटी कॉल से पहले एक विकल्प कॉल किया जाता है और हमेशा विफल रहता है, क्योंकि यह beforeSend() का उपयोग नहीं करता है और इसलिए असफल प्रमाणीकरण के कारण 401 प्रतिक्रिया प्राप्त होती है।

क्या यह एक बेहतर तरीका है कि एक बहुत ही छोटा कॉल होना चाहिए? क्या यह तथ्य होना चाहिए कि विकल्प अनुरोध beforeSend() फ़ंक्शन प्रोसेसिंग का उपयोग नहीं करते हैं? क्या ऑप्शन चेक को पूरी तरह से अक्षम करने का कोई तरीका है? यह कॉल क्रॉस-साइट नहीं बनाना संभव है, क्योंकि जावास्क्रिप्ट एक ही मशीन पर "क्रॉस-साइट" के रूप में एक अलग पोर्ट नंबर पर विचार करना प्रतीत होता है।

+0

आप से पहले भेजने के लिए और उपयोगकर्ता नाम/पासवर्ड क्षेत्रों की जरूरत नहीं है । मैं आपके $ .ajax फ़ंक्शन से उपयोगकर्ता नाम/पासवर्ड फ़ील्ड हटा दूंगा। –

उत्तर

1

यहां कुछ ऐसा है जो AJAX कॉल के लिए पास-थ्रू प्रमाणीकरण के रूप में कार्य करता है। यह उस पृष्ठ पर प्रमाणीकृत करने के लिए NTLM पर निर्भर करता है जिस पर जावास्क्रिप्ट निष्पादित होगा। हो सकता है कि यह तुम्हारी मदद करेगा:

पीएचपी कोड:

<?php 
$headers = apache_request_headers(); 
if (isset($headers['Authorization'])) 
    echo "<script>var auth = " . $headers['Authorization'] . "</script>"; 
unset($headers); 
?> 

jQuery का उपयोग करके आप इसे इस तरह का प्रयोग करेंगे:

$.ajax({ 
     type: 'POST', 
     url: './somePage.php', 
     data: {"test":true}, 
     dataType: 'json', 
     success: function(data) { 
      console.log(data.username); 
     }, 
     beforeSend : function(req) { 
      req.setRequestHeader('Authorization', auth); // <<<<----- USED HERE 
     }, 
}); 

मानक XMLHttpRequest के लिए:

var xml = new XMLHttpRequest(); 
xml.open('GET', './somePage.php', true); 
xml.setRequestHeader('Authorization', auth); // <<<<----- USED HERE 
xml.send(); 
+0

यदि आप 'auth' चर जैसा दिखेंगे, इसका एक उदाहरण प्रदान किया गया तो यह सहायक होगा। मुझे लगता है कि यह उपयोगकर्ता और पासवर्ड गुणों के साथ एक वस्तु है, लेकिन – TKoL

+0

@TKoL के बारे में स्पष्ट होना सबसे अच्छा होगा ओपी 'auth' मान का एक उदाहरण प्रदान करता है। अनिवार्य रूप से, यह है: 'बेसिक" + एनकोडबेसबेस 64 (उपयोगकर्ता नाम + ":" + पासवर्ड)); ' –

+0

धन्यवाद @ wes.hysell। मेरे लिए जो स्पष्ट नहीं था। – TKoL

3

यह सवाल है शायद इसकी समाप्ति तिथि से पहले अच्छी तरह से, लेकिन मैं jquery के साथ एक ही चीज़ के साथ काम कर रहा था और एस के पार आया एएम समस्या

उपयोगकर्ता नाम और पासवर्ड विशेषताएँ सामान्य रूप से HTTP मूल लेख को पूरा करने के लिए उपयोगकर्ता नाम/पासवर्ड का आधार 64 एन्कोड नहीं लगती हैं।निम्नलिखित अनुरोध पर

देखो (संक्षिप्तता के लिए छोटा), सबसे पहले "उपयोगकर्ता नाम" और JQuery AJAX विधि में "पासवर्ड" पैरामीटर का उपयोग कर:

Request URL:http://testuser%40omnisoft.com:[email protected]:60023/Account 
Request Method:GET 
Accept:application/json, text/javascript, */*; q=0.01 
Host:localhost:60023 

और अब beforeSend विधि के साथ:

Request URL:http://localhost:60023/Account 
Request Method:GET 
Accept:application/json, text/javascript, */*; q=0.01 
Authorization:Basic dXNlcm5hbWU6cGFzc3dvcmQ= 
Host:localhost:60023 

ध्यान दें कि पहली विधि में अनुरोध में 'प्राधिकरण' शीर्षलेख शामिल नहीं है, बल्कि इसके बजाय लक्ष्य URL को उपसर्ग करता है। मैं HTTP मूल लेख पर कोई विशेषज्ञ नहीं हूं, लेकिन यह इंगित करेगा कि पूर्व उचित कार्यान्वयन नहीं है और इसलिए विफल रहता है (या कम से कम यह मेरे अपने सर्वर कार्यान्वयन के साथ करता है)।

JSONP का उपयोग करके आपके OPTIONS अनुरोध के रूप में - संभवतः आप स्पष्ट होने के लिए crossdomain विकल्प का उपयोग करने के बजाय अपने URL में ?callback=? का उपयोग करने का प्रयास कर सकते हैं।

1

इस मुद्दे के माध्यम से आने वाले किसी भी व्यक्ति के लिए, मैंने अपाचे के साथ विकल्प अनुरोधों को अवरुद्ध करने और बैकएंड में केवल जीईटी और पीओएसटी को अग्रेषित करने के मुद्दे को हल कर लिया है।

यह समाधान appserver स्वतंत्र है और इस तरह के रूप में अच्छी तरह से PHP और जावा के लिए काम करता है:

<VirtualHost *:80> 

    # ServerName and other configuration... 


    # CORS 
    Header set Access-Control-Allow-Origin "*" 
    Header set Access-Control-Allow-Methods "OPTIONS, GET, PUT, POST" 
    Header set Access-Control-Allow-Headers "Authorization" 

    # Intercept OPTIONS calls 
    RewriteEngine On 
    RewriteCond %{REQUEST_METHOD} ^(OPTIONS)$ 
    RewriteRule .* - [L] 

    # Backend, adapt this line to fit your needs 
    RewriteRule /(.*) ajp://localhost:8010/$1 [L,P] 

</VirtualHost> 

सादर, मौरीज़ियो

+0

एक उचित आरईएसटी कार्यान्वयन के लिए, आप शायद 'PUT' विधि भी शामिल करना चाहेंगे। –

+0

निश्चित रूप से, धन्यवाद जेज़न! – Maurix

संबंधित मुद्दे