2012-06-24 7 views
18

मैं एक ऐप पर काम कर रहा हूं, जहां सर्वर और एपीआई उपभोक्ता ग्राहक अलग-अलग डोमेन के अंतर्गत रहते हैं, इसलिए मैं CORS का उपयोग करना चाहता हूं। ऐसा करने के लिए, मैं जवाब में सर्वर इसी http हेडर सेट करना होगा:उपयोगकर्ता को अधिकृत नहीं होने पर CORS शीर्षलेख कैसे भेजें (401 प्रतिक्रिया)

def cors_set_access_control_headers 
    headers['Access-Control-Allow-Origin'] = 'http://localhost' 
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
    headers['Access-Control-Allow-Headers'] = '*, X-Requested-With, X-Prototype-Version, X-CSRF-Token, Content-Type' 
    headers['Access-Control-Max-Age'] = "1728000" 
end 

इस विधि ApplicationController में एक before_filter के रूप में प्रयोग किया जाता है।

कुछ संसाधनों के लिए उपयोगकर्ता को प्रमाणीकृत और अधिकृत होना है। एक्सएचआर/अजाक्स के माध्यम से अनुरोध किए जाते हैं। इसलिए यदि उपयोगकर्ता Devise प्रमाणीकृत नहीं है, तो पृष्ठ में साइन इन करने के बजाय ग्राहक को 401 प्रतिक्रिया भेजेंगी। लेकिन सीओआरएस हेडर सेट करने के लिए फ़िल्टर का उपयोग उस प्रतिक्रिया के लिए नहीं किया जाता है। इस प्रकार 401 प्रतिक्रिया ग्राहक को नहीं भेजी जाती है। मैं क्लाइंट में 401 प्रतिक्रिया पकड़ना और उपयोग करना चाहता हूं।

वर्तमान में मैं वसीयत प्रमाणीकरण तरीकों का उपयोग नहीं द्वारा एक समाधान का उपयोग कर रहा है, लेकिन एक कस्टम प्रमाणन टुकड़ा:

def authenticate_cors_user 
    if request.xhr? && !user_signed_in? 
    error = { :error => "You must be logged in." } 
    render params[:format].to_sym => error, :status => 401 
    end 
end 

यह ApplicationController में एक before_filter के रूप में भी स्थापित किया जाएगा। इस तरह सीओआरएस हेडर सेट करने के लिए फ़िल्टर ट्रिगर हो जाता है और सबकुछ ठीक काम करता है।

मैं वसीयत के डिफ़ॉल्ट व्यवहार को उपयोग करने के लिए पसंद करते हैं, लेकिन CORS हेडर 401 के जवाब में स्थापित किया जाना होगा। यह कैसे करना है? क्या मुझे इसके लिए warden कॉन्फ़िगर करना है?

सीओआरएस हेडर को अपनी प्रतिक्रिया बनाने के बजाय डेविस द्वारा उत्पन्न 401 प्रतिक्रिया के लिए कैसे सेट किया जा सकता है?

+0

फिर भी मुझे लगता है कि के लिए एक समाधान नहीं है। कुछ और संदर्भ देने के लिए, मैं इस ब्लॉग का उपयोग कैसे कर रहा हूं इसके बारे में अपने ब्लॉग पोस्ट को देखें: http://nils-blum-oeste.net/cors-api-with-oauth2- प्रमाणीकरण-using-rails-and-angularjs –

उत्तर

21

मैं सफलतापूर्वक रैक CORS मणि https://github.com/cyu/rack-cors का इस्तेमाल किया और my blog पर मेरे अनुभव को रेखांकित किया।

पंचलाइन: मिडलवेयर आदेश निर्दिष्ट करें, ताकि CORS हैंडलर वार्डन से पहले है:

config.middleware.insert_before Warden::Manager, Rack::Cors 
+0

आपका दृष्टिकोण बढ़िया काम करता है, धन्यवाद! हालांकि, आश्चर्यजनक रूप से, इसमें कुछ समय और कुछ अतिरिक्त शोध हुआ, यह महसूस करने के लिए कि मुझे वास्तव में 'डेविस' और 'रैक-कॉर्स' को एक साथ काम करने के लिए कॉन्फ़िगरेशन में कोड की केवल एक पंक्ति को बदलना है। –

+0

हे @ digger69। क्या आपको अन्य अपवादों के साथ समस्याएं थीं? उदाहरण के लिए: यदि मैंने अपनी क्रिया 'डीफ़ इंडेक्स में अपवाद फेंक दिया है; 'त्रुटि' उठाओ; अंत' - रेल सीओआरएस हेडर (रैक-कॉर्स) वापस नहीं लौटाती है। क्या यह आपके लिए काम करता है? –

+4

पीएस: आप 'config.middleware.insert 0, रैक :: कॉर्स' का भी उपयोग कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि 'रैक :: कॉर्स' किसी अन्य संभावित मिडलवेयर से पहले डाला जाएगा। –

0

हम आम तौर पर CORS हेडर पसंद नहीं आया। हम रीडायरेक्ट करने के लिए हैप्रोक्सी का उपयोग करना पसंद करते हैं।

HAProxy के साथ आप आंतरिक रूप से अपने रेल मशीन पर पुनः निर्देशित किया करने के लिए website.com/api/ के लिए आ रहा सभी अनुरोधों को सेट कर सकते हैं।

frontend main *:80 
    acl api  path_beg -i /api 
    acl app  path_beg -i /app 
backend app_backend 
    reqrep ^([^\ ]*)\ /app/(.*) \1\ /\2 
    balance roundrobin 
    server app_files smartphoneapp.localhost:8000 
backend api_backend 
    reqrep ^([^\ ]*)\ /api/(.*) \1\ /\2 
    balance roundrobin 
    server app_api localhost:3000 
+0

सीओआरएस एक प्रॉक्सी का उपयोग करके छेड़छाड़ की जानी चाहिए। लेकिन मुझे लगता है कि अभी भी डेविस/वार्डन के साथ इस अच्छी तरह से संभालने का एक तरीका होना चाहिए। –

+0

इस आलेख को देखें: http://www.tsheffler.com/blog/?p=428 – Hendrik

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