2015-07-10 21 views
7

मैं काम करने के लिए एक बुनियादी एपीआई कॉल प्राप्त करने की कोशिश कर रहा हूं हालांकि एपीआई प्रदाता किसी भी डेवलपर समर्थन की पेशकश नहीं करता है। उन्हें आवश्यकता है कि प्रत्येक कॉल बेस 64 मूल प्रमाणीकरण शीर्षलेख में भेजें। जब मैं अपनी ऑनलाइन एपीआई परीक्षण उपयोगिता का उपयोग करता हूं तो मेरी चाबियाँ वैध होती हैं लेकिन मैं इसे अपने कोड या JSFiddle.net में काम करने के लिए नहीं मिल सकता। मैंने "प्रमाणीकरण: बेसिक ...." मान को कॉपी करने का भी प्रयास किया जो मेरे कोड के भीतर परीक्षण उपयोगिता से वापस आ गया है और यह काम नहीं करता है।अजाक्स एपीआई कॉल पर बेस 64 प्रमाणीकरण

मैंने स्टैक ओवरफ्लो के भीतर कई उदाहरण देखे हैं और मैं बिना किसी समस्या के अन्य एपीआई के लिए समान कोड का उपयोग करता हूं। बेस 64 मूल लेख मेरे लिए नया है और जब मैं आईई में कोड चलाता हूं तो डीबगर एक वाक्यविन्यास त्रुटि बताता है जो मुझे नहीं मिल रहा है। अगर कोई त्रुटि उत्पन्न हुई तो मुझे 401 त्रुटि की उम्मीद थी।

त्रुटि पर कोई विचार या इसे डीबग करने के अतिरिक्त तरीके?

$(document).ready(function() { 
    var mySecret = "somevalue"; 
    var myClientId = "somevalue"; 
    $.ajax({ 
     url: "https://www.udemy.com/api-2.0/courses/", 
     type: 'GET', 
     dataType: "json", 
     contentType: "text/plain", 
     beforeSend: function (xhr) { 
      xhr.setRequestHeader("Authorization", "Basic " + btoa(myClientId+":"+ mySecret)); 
     }, 
     success: function(data) { 
      alert("hi"); 
     } 
    }); 
}); 
+0

आप कहते हैं कि आप एक राज्यों में सिंटेक्स त्रुटि हो रही है। क्या आप हमें बता सकते हैं कि त्रुटि संदेश क्या कहता है। – bhspencer

+0

मुझे 10 dev कंसोल के साथ ब्रेकपॉइंट में संदेश वाक्यविन्यास त्रुटि के अलावा कोई विवरण नहीं दिख रहा है। –

+1

क्या आप वाकई ऑथ हेडर जोड़ने की ज़रूरत है? मैं बिना ऑथ हेडर – bhspencer

उत्तर

5

क्या आप शायद यहाँ मिल गया है CORS या Cross Origin Resource Sharing के साथ एक समस्या है। यह साइट्स को मनमाने ढंग से अनुरोध करने से रोकता है। इसके कारण जटिल हैं, लेकिन यह आपको सुरक्षित रखता है! हालांकि, यह एक बड़ा दर्द है।

अपने आसान डेन्डी Chrome Dev Tools को फायर करें और उस नेटवर्क अनुरोध के लिए वास्तव में क्या हो रहा है पर एक नज़र डालें। समान मूल नीति (सीओआर) की वजह से यह निश्चित रूप से जेएसफ़िल्ड में काम नहीं करता है।

आप ब्राउज़र में JSON प्राप्त कर सकते हैं क्योंकि यह क्रॉस साइट अनुरोध नहीं है। देखें कि कौन से शीर्षलेख आगे और आगे भेजे जा रहे हैं, और देखें कि Allow-Origin शीर्षलेख के लिए स्वीकार्य Origin सेट करने के लिए आपके Udemy API पोर्टल में कोई तरीका है या नहीं। यदि आप स्थानीय रूप से काम कर रहे हैं तो आपका आईपी पता शायद।

+0

लेकिन यदि आप AJAX कॉल में अतिरिक्त विकल्प जोड़ते हैं जैसे कि सादा पाठ को टाइप करना, तो CORS को संभाल नहीं सकता है? मैंने सीओआरएस मुद्दे को हल करने के लिए अन्य roduct api कॉल के लिए ऐसा किया था। –

+0

यह इस बात पर निर्भर करता है कि जिस स्रोत से आप डेटा का अनुरोध कर रहे हैं, उसमें 'अनुमति-उत्पत्ति: *' हेडर सेट है या नहीं। यदि नहीं तो आप एक्सएचआर नहीं बना सकते हैं, लेकिन आप इसे सर्वर की तरफ कर सकते हैं। या यह हो सकता है कि जिस सर्वर से आप अनुरोध कर रहे हैं वह केवल 'सामग्री-प्रकार: एप्लिकेशन/जेसन' का जवाब देगा। – Breedly

-1

आम तौर पर अजाक्स एक ही डोमेन के साथ काम करते हैं। प्राप्त करने के लिए क्रॉस डोमेन CORSCORS URL

+0

कृपया मूल समस्या को भी देखें जिसमें प्रमाण-पत्रों के बेस 64 एन्कोडिंग शामिल हैं। –

1

आप इस तरह सांकेतिक शब्दों में बदलना कर सकते हैं के साथ प्रयास करें:

var header = {"Authorization": "Basic " + btoa(username + ":" + password)}; 

इस तरह ajax कॉल करने के लिए शीर्षलेख जोड़ें:

$.ajax({ 
    url: "https://www.udemy.com/api-2.0/courses/", 
    type: 'GET', 
    dataType: "json", 
    contentType: "text/plain", 
    header, 
    success: function(data) { 
     alert("hi"); 
    } 
}); 

यह वैसे भी मेरे लिए काम करता है। सुझाए गए अनुसार आपको सीओआरएस की भी आवश्यकता होगी।

1

ऐसा लगता है कि आपको बेस 64 ऑथ डेटा मैन्युअल रूप से अनुरोध शीर्षलेख सेट करने की आवश्यकता है।

निर्देश यहां हैं: http://coderseye.com/2007/how-to-do-http-basic-auth-in-ajax.html

आप पहली बार यहां से निम्न कोड उठाने की जरूरत: बेस 64 एन्कोडिंग

/** 
* 
* Base64 encode/decode 
* http://www.webtoolkit.info/ 
* 
**/ 

var Base64 = { 

    // private property 
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/=", 

    // public method for encoding 
    encode : function (input) { 
     var output = ""; 
     var chr1, chr2, chr3, enc1, enc2, enc3, enc4; 
     var i = 0; 

     input = Base64._utf8_encode(input); 

     while (i < input.length) { 

      chr1 = input.charCodeAt(i++); 
      chr2 = input.charCodeAt(i++); 
      chr3 = input.charCodeAt(i++); 

      enc1 = chr1 >> 2; 
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 
      enc4 = chr3 & 63; 

      if (isNaN(chr2)) { 
       enc3 = enc4 = 64; 
      } else if (isNaN(chr3)) { 
       enc4 = 64; 
      } 

      output = output + 
      this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + 
      this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); 

     } 

     return output; 
    }, 

    // public method for decoding 
    decode : function (input) { 
     var output = ""; 
     var chr1, chr2, chr3; 
     var enc1, enc2, enc3, enc4; 
     var i = 0; 

     input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 

     while (i < input.length) { 

      enc1 = this._keyStr.indexOf(input.charAt(i++)); 
      enc2 = this._keyStr.indexOf(input.charAt(i++)); 
      enc3 = this._keyStr.indexOf(input.charAt(i++)); 
      enc4 = this._keyStr.indexOf(input.charAt(i++)); 

      chr1 = (enc1 << 2) | (enc2 >> 4); 
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 
      chr3 = ((enc3 & 3) << 6) | enc4; 

      output = output + String.fromCharCode(chr1); 

      if (enc3 != 64) { 
       output = output + String.fromCharCode(chr2); 
      } 
      if (enc4 != 64) { 
       output = output + String.fromCharCode(chr3); 
      } 

     } 

     output = Base64._utf8_decode(output); 

     return output; 

    }, 

    // private method for UTF-8 encoding 
    _utf8_encode : function (string) { 
     string = string.replace(/\r\n/g,"\n"); 
     var utftext = ""; 

     for (var n = 0; n < string.length; n++) { 

      var c = string.charCodeAt(n); 

      if (c < 128) { 
       utftext += String.fromCharCode(c); 
      } 
      else if((c > 127) && (c < 2048)) { 
       utftext += String.fromCharCode((c >> 6) | 192); 
       utftext += String.fromCharCode((c & 63) | 128); 
      } 
      else { 
       utftext += String.fromCharCode((c >> 12) | 224); 
       utftext += String.fromCharCode(((c >> 6) & 63) | 128); 
       utftext += String.fromCharCode((c & 63) | 128); 
      } 

     } 

     return utftext; 
    }, 

    // private method for UTF-8 decoding 
    _utf8_decode : function (utftext) { 
     var string = ""; 
     var i = 0; 
     var c = c1 = c2 = 0; 

     while (i < utftext.length) { 

      c = utftext.charCodeAt(i); 

      if (c < 128) { 
       string += String.fromCharCode(c); 
       i++; 
      } 
      else if((c > 191) && (c < 224)) { 
       c2 = utftext.charCodeAt(i+1); 
       string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); 
       i += 2; 
      } 
      else { 
       c2 = utftext.charCodeAt(i+1); 
       c3 = utftext.charCodeAt(i+2); 
       string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); 
       i += 3; 
      } 

     } 

     return string; 
    } 

} 

तो फिर तुम प्रमाणन के निर्माण के लिए कोड की आवश्यकता होगी करने के लिए http://www.webtoolkit.info/javascript-base64.html

function make_base_auth(user, password) { 
    var tok = user + ':' + password; 
    var hash = Base64.encode(tok); 
    return "Basic " + hash; 
} 
:
डेटा, यह सिर्फ एक उपयोगकर्ता की बेस 64 और पासवर्ड है

और फिर तुम सिर्फ अनुरोध करने से पहले jQuery के साथ शीर्ष लेख:

var service_url = "https://www.udemy.com/api-2.0/courses/" 
$.ajax({ 
    type: "GET", 
    url: service_url, 
    dataType: "xml", 
    data: "ParamId=" + FormId.value, 
    processData: false, 
    beforeSend : function(req) { 
     req.setRequestHeader('Authorization', 
       make_base_auth ('myClientId', 'mySecret')); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
     ajaxError(XMLHttpRequest, textStatus, errorThrown); 
    }, 
    success: function(xml) { DoSomething(xml); } 
}); 
संबंधित मुद्दे