2012-04-10 17 views
46

मेरे सर्वर में मैन्युअल प्रमाणीकरण है। मुझे अपने सर्वर के उपयोगकर्ता नाम/पासवर्ड को मेरे रीढ़ की हड्डी के अनुरोध में जाने की आवश्यकता है। मैं यह कैसे कर सकता हूँ? कोई विचार? धन्यवादरीढ़ की हड्डी पर अनुरोध शीर्षलेख

उत्तर

50

बैकबोन में मॉडल fetch, save, और destroy विधियों का उपयोग करके डेटा पुनर्प्राप्त, अद्यतन और नष्ट कर सकते हैं। ये विधियां Backbone.sync को वास्तविक अनुरोध भाग का प्रतिनिधि करती हैं। हुड के तहत, सभी Backbone.sync कर रहा है jQuery का उपयोग कर AJAX अनुरोध बना रहा है। अपने मूल HTTP प्रमाणीकरण को शामिल करने के लिए आपके पास कुछ विकल्प हैं।

fetch, save, और destroy सभी अतिरिक्त पैरामीटर [options] स्वीकार करते हैं। ये [options] बस jQuery अनुरोध विकल्पों का एक शब्दकोश है जो jQuery AJAX कॉल में शामिल हो जाता है। इसका मतलब है आप आसानी से एक सरल तरीका है जिसके प्रमाणीकरण संलग्न कर देता है परिभाषित कर सकते हैं:

sendAuthentication = function (xhr) { 
    var user = "myusername";// your actual username 
    var pass = "mypassword";// your actual password 
    var token = user.concat(":", pass); 
    xhr.setRequestHeader('Authorization', ("Basic ".concat(btoa(token)))); 
} 

और यह प्रत्येक fetch, save में शामिल हैं, और destroy आप कर कहते हैं। इस प्रकार:

fetch({ 
    beforeSend: sendAuthentication 
}); 

यह पुनरावृत्ति का थोड़ा सा निर्माण कर सकता है। एक और विकल्प Backbone.sync विधि को ओवरराइड करने के लिए हो सकता है, मूल कोड कॉपी करें और केवल प्रत्येक jQuery AJAX अनुरोध में beforeSend विकल्प शामिल करें।

आशा है कि इससे मदद मिलती है!

+0

अपने कोड की कोशिश की। लेकिन कोई प्रतिक्रिया नहीं है। यह सेवा नहीं बुलाता है। – jongbanaag

+0

कोई प्रतिक्रिया नहीं? या आप एक 401 प्रतिक्रिया कोड प्राप्त कर रहे हैं? – shanewwarren

+1

नहीं। वैसे भी। क्या आप मुझे backbone.sync को हेडर पर ओवरराइड करने के तरीके पर एक नमूना कोड दे सकते हैं? – jongbanaag

39

बैकबोन.जेएस में अनुरोध शीर्षलेख जोड़ने का सबसे आसान तरीका यह है कि उन्हें केवल चरम विधि पर पैरामीटर के रूप में पास करना है, उदा।

MyCollection.fetch({ headers: {'Authorization' :'Basic USERNAME:PASSWORD'} }); 
+0

यह मेरे लिए काम करता है, आश्चर्य की बात है! और जब तक मैं किसी को आश्चर्यचकित कर रहा हूं, तब तक यह दस्तावेज़ों में नहीं है। इसे संभालने के लिए बेहद आसान तरीका;) अद्भुत। > धन्यवाद! – albertpeiro

+1

जो उपयोगकर्ता नाम के पास तक काम करता है: इसमें, आपको वास्तव में बेसकोड एन्कोड उपयोगकर्ता नाम होना चाहिए: पासवर्ड – dstarh

3
Object.save(
    {'used': true} 
    {headers: {'Access-Token': 'access_token'}} 
) 
+0

क्या वह वैश्विक है? – Trip

+0

यह वही उत्तर है [उपरोक्त 'उदाहरण ऊपर] (https://stackoverflow.com/a/11846129/1218980), लेकिन बिना किसी स्पष्टीकरण के। –

16

आप रीढ़ सिंक विधि रद्द कर सकते थे।

#coffeescript 
_sync = Backbone.sync 
Backbone.sync = (method, model, options) -> 
    options.beforeSend = (xhr) -> 
     xhr.setRequestHeader('X-Auth-Token_or_other_header' , your_hash_key) 
     #make sure your server accepts X-Auth-Token_or_other_header!! 
    #calling the original sync function so we only overriding what we need 
    _sync.call(this, method, model, options)  
27

एक विकल्प jQuery AJAXSetup का उपयोग करने के लिए हो सकता है, सभी बैकबोन अनुरोध अंततः अंतर्निहित jQuery AJAX का उपयोग करेंगे। इस दृष्टिकोण का लाभ यह है कि आपको केवल इसे एक स्थान जोड़ना होगा।

$.ajaxSetup({ 
    headers: { 'Authorization' :'Basic USERNAME:PASSWORD' } 
}); 

2 संपादित करें जनवरी 2018 जटिल वेब एप्लिकेशन के लिए यह सबसे अच्छा तरीका नहीं हो सकता है, नीचे टिप्पणी देखें। संदर्भ के लिए यहां उत्तर छोड़ना।

+1

ऐसा लगता है कि यह काम कर सकता है, ** इस ** का उपयोग किसी अन्य उत्तर में वर्णित कारणों के लिए नहीं करें [https://stackoverflow.com/a/41991573/1218980)। –

+1

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

10
Backbone.$.ajaxSetup({ 
    headers: {'Authorization' :'Basic USERNAME:PASSWORD'} 
}); 

यह कोड बैकबोन AJAX पर शीर्षलेख सेट करता है, इसलिए उन्हें प्रत्येक Backbone.sync के साथ भेजा जाएगा। आप प्रत्येक सिंक कॉल के साथ xhr.setRequestHeader का उपयोग किये बिना हेडर भेजने में सक्षम होंगे।

तो तुम हर बार निम्न कार्य करने की जरूरत नहीं है:

MyCollection.fetch({ headers: {'Authorization' :'Basic USERNAME:PASSWORD'} }); 

तुम बस

MyCollection.fetch(); 

कर सकते हैं हो सकता है कि यह एक तरह की हैक है, लेकिन यह अपने सिस्टम के लिए पूरी तरह से काम करता है।

+0

शायद आप इस बारे में एक स्पष्टीकरण दे सकते हैं कि यह प्रश्न का उत्तर कैसे देता है? –

+0

धन्यवाद, यह बहुत अच्छा काम किया। – Cymen

+0

यह एक हैक है जिसका उपयोग [मेरे दूसरे जवाब] में सूचीबद्ध कारणों के लिए नहीं किया जाना चाहिए (https://stackoverflow.com/a/41991573/1218980)। यह वही उत्तर है [ऊपर '$ .ajaxSetup' ऊपर] (https://stackoverflow.com/a/20633326/1218980)। –

4

इस तरह से कुछ करने का मेरा दृष्टिकोण अनुरोध करने से पहले हेडर जोड़ने के लिए सिंक विधि को ओवरराइट कर देगा। उदाहरण में आप देख सकते हैं कि मैं Backbone.AuthenticatedModel बना रहा हूं, जो Backbone.Model से फैला हुआ है।

यह सभी तरीकों (प्राप्त, पोस्ट, हटाएँ, आदि)

Backbone.AuthenticatedModel = Backbone.Model.extend({ 
    sync: function(method, collection, options){ 
     options = options || {}; 
     options.beforeSend = function (xhr) { 
      var user = "myusername";// your actual username 
      var pass = "mypassword";// your actual password 
      var token = user.concat(":", pass); 
      xhr.setRequestHeader('Authorization', ("Basic ".concat(btoa(token)))); 
     }; 
     return Backbone.Model.prototype.sync.apply(this, arguments); 
    } 

}); 

प्रभाव होगा तो फिर तुम सरल करने के लिए है से Backbone.AuthenticatedModel आपके द्वारा बनाए गए मॉडल आप प्रमाणीकरण की आवश्यकता है, का विस्तार:

var Process = Backbone.AuthenticatedModel.extend({ 
    url: '/api/process', 

}); 
+1

मुझे आपका समाधान पसंद है! लेकिन वापसी लाइन में मैं 'Backbone.Model.prototype.sync.apply (यह, तर्क) 'को इसके बजाय कॉल करूंगा। –

+0

@ क्रिस्टियन-कॉन्डेरा आप सही हैं, यह एक और अधिक सुरुचिपूर्ण और सही तरीका होगा। जैसा कि आपने –

+1

सुझाया है, कोड को बदल दिया है, मैं पहले कॉलबैक भेजने के पहले नए 'पहले सेन्डेंड' विकल्प (यदि पास हो गया) में एक कॉल जोड़ूंगा। संदर्भ के लिए एनोटेटेड स्रोत देखें: http://backbonejs.org/docs/backbone.html#section-179 –

-1
  1. ग्राहक के पक्ष में, किसी भी सर्वर संचार से पहले इस जोड़ें:

    $.ajaxSetup({ 
        xhrFields: { 
         withCredentials: true 
        }, 
        async: true 
    }); 
    
  2. सर्वर साइड में (PHP) इन हेडर जोड़ें:

    header('Access-Control-Allow-Origin: http://your-client-app-domain'); 
    header("Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS"); 
    header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With"); 
    header('Access-Control-Allow-Credentials: true'); 
    
1

कस्टम समन्वयन विधि है कि Backbone.sync के लिए कॉल को बीच में रोक और में अपने प्राधिकरण हेडर सामान और सब कुछ गुजरता के माध्यम से बनाएं :

REPORTING_API_KEY = 'secretKeyHere'; 
    CustomSync = function(method, model, options) { 
     options.headers = { 
      'Authorization' : 'Bearer ' + REPORTING_API_KEY 
     }; 
     return Backbone.sync(method, model, options); 
    }; 

तो यह है कि एक के साथ अपने मॉडल की समन्वयन के ऊपर लिख:

MyModel = Backbone.Model.extend({ 
     urlRoot: '/api/', 
     sync: CustomSync 
    }); 
+0

यह एक अच्छा तरीका है, लेकिन 'सिंक' फ़ंक्शन को ओवरराइट करने की बजाय, आपको इसे ओवरराइड करना चाहिए और माता-पिता को कॉल करना चाहिए 'Backbone.sync' होने की गारंटी नहीं है। –

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