CORS

2015-05-22 1 views
17

मुझे लगता है कि ASP.NET वेब एपीआई के साथ बनाया गया एक API साथ सूचना का आदान एक कोणीय एप्लिकेशन बनाने रहा हूँ के साथ preflight विकल्प अनुरोध बचना 2. मैं प्रत्येक अनुरोध है कि प्रमाणीकरण की आवश्यकता के साथ एक Authorization हैडर भेजकर बेसिक प्रमाणीकरण का उपयोग कर रहा कोणीय टुकड़ा:CORS

$http.defaults.headers.common['Authorization'] = authHeader; 

अनुरोध:

Accept:application/json, text/javascript 
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:en-US,en;q=0.8 
Access-Control-Max-Age:1728000 
Authorization:Basic [base64 encoded credential couplet here] 
Connection:keep-alive 
DNT:1 
Host: blah.com 
Origin:http://localhost:9000 
Referer:http://localhost:9000/ 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/53 

यह सब ठीक है, लेकिन एक preflight OPTIONS अनुरोध प्रत्येक GET या POST अनुरोध के साथ भेजा जाता है। यह मुख्य रूप से आवेदन की अनुमानित गति को प्रभावित कर रहा है। मैंने सीओआरएस "सरल अनुरोध" पर बहुत सी पढ़ाई की है और ऐसा लगता है कि ड्रेडेड प्रीफलाइट OPTIONS से बचने के लिए अनुरोध है कि मेरे अनुरोधों में कोई कस्टम हेडर जोड़ने से बचें। मैंने text/plain के Content-Type भेजने जैसे कई अन्य सामानों की कोशिश की है, लेकिन ऐसा लगता है कि प्राधिकरण शीर्षलेख वह चीज है जो सीओआरएस "सरल अनुरोध" आवश्यकता का उल्लंघन कर रही है।

तो ऐसा लगता है कि मुझे टोकन आधारित प्रमाणीकरण/प्रमाणीकरण का उपयोग करने के लिए एपीआई को स्थानांतरित करना पड़ सकता है। प्रीफलाइट अनुरोधों से बचने के लिए, ऐसा लगता है कि मुझे क्वेरी स्ट्रिंग में टोकन रखना होगा। यह ठीक है क्योंकि यह केवल एक छोटा आंतरिक वेब ऐप है जिसे वैसे भी कुछ उपयोगकर्ताओं द्वारा एक्सेस किया जाएगा। मैं नियंत्रक प्रतिक्रियाओं पर कैशिंग लागू करने का इरादा रखता हूं। चूंकि नियंत्रक कार्रवाई के प्रत्येक अनुरोध के पास वर्तमान में प्रमाणीकृत उपयोगकर्ता के आधार पर क्वेरीस्ट्रिंग में एक अलग टोकन होगा, क्या यह बेकार कैशिंग प्रदान करेगा?

तो:

  1. मैं कैसे
  2. तो 1.) संभव नहीं है (यदि सभी संभव कस्टम प्राधिकरण हेडर का उपयोग करके) preflight अनुरोध से बचने के है, और मैं आधारित प्रमाणीकरण टोकन के लिए ले जाते हैं, मैं नहीं कर सकेंगे नियंत्रक क्रियाओं के लिए कैश एपीआई प्रतिक्रिया
  3. प्रीफलाइट अनुरोधों से बचने के लिए सबसे व्यापक रूप से उपयोग किए जाने वाले तरीकों क्या हैं लेकिन उपयोगकर्ताओं को सुरक्षित रूप से लेखित करने के लिए भी?

nb मुझे पता है कि इतना और कहीं और इस बारे में वेब पर पर अन्य धागे के एक जोड़े हैं, लेकिन उनमें से कोई भी है कि क्या यह संभव है GET और POST के लिए preflight अनुरोध से बचने के लिए पर एक निश्चित जवाब प्रदान करने के लिए करते हैं कस्टम HTTP प्राधिकरण शीर्षलेख का उपयोग करते समय।

+1

1.) सभी ब्राउज़रों और HTTP विधियों में जितना संभव हो अभी तक नहीं है: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests – tyler

+1

आप का उपयोग करने के लिए सक्षम होना चाहिए [XMLHttpRequest withCredentials] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials) प्राधिकरण कुकी के साथ एक गैर-प्रीफलाइट अनुरोध भेजने के लिए। – dave

उत्तर

10

मैं इस पोस्ट (How to apply CORS preflight cache to an entire domain) लगता है कि यह सब काफी कहते हैं - वहाँ ज्यादा नहीं है आप के बारे में क्या कर सकते हैं इस

एक सरल समाधान अपने कोणीय एप्लिकेशन की सेवा प्रॉक्सी/वेब सर्वर पर एक रिवर्स प्रॉक्सी जोड़ना है (उदाहरण के लिए nginx) उसी रीस्टफुल कॉल को उसी डोमेन के माध्यम से रूट करने के लिए, उदाहरण के लिए appdomain.com/api -> apidomain.com।

+1

धन्यवाद रेटो! हालांकि मैं पूरी तरह से preflight चीज को उचित तरीके से हल करना पसंद करता, फिर भी मैंने अंततः इस जवाब का चयन किया। यह पता चला है कि आप आईआईएस में और एक एज़ूर वेबसाइट में एक रिवर्स प्रॉक्सी स्थापित कर सकते हैं, इसलिए मेरे क्लाइंट को एज़ूर होस्ट करने वाले अन्य एज़ूर वेब ऐप पर स्थानीय '/ एपीआई' अनुरोधों को अग्रेषित करने के साथ एक एज़ूर वेब ऐप में भी होस्ट किया जाएगा। संदर्भ: http://ruslany.net/2014/05/using-azure-web-site-as-a-reverse-proxy/ – adaam

2

एक और समाधान जो मेरे लिए ठीक काम कर रहा है। प्रॉक्सी स्थापित करने और उसी डोमेन पर जाने की आवश्यकता के बजाय, प्रीफलाइट अनुरोध को सीधे nginx से वापस करना संभव है और इसलिए प्रीफलाइट अनुरोध द्वारा आवश्यक कुछ मिनट को केवल मिलीसेकंड तक कम करना संभव है।

यहां एक साधारण स्निपेट है जिसका उपयोग nginx के साथ किया जा सकता है।

location/{ 
    if ($request_method = 'OPTIONS') { 
     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 
     add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization'; 
     add_header 'Access-Control-Max-Age' 1728000; 
     add_header 'Content-Type' 'text/plain charset=UTF-8'; 
     add_header 'Content-Length' 0; 
     return 204; 
    } 
} 

एक बार preflight अनुरोध सफल होने पर, यह तो सरल ऐड "पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति" और अन्य आवश्यक सामान के लिए संभव 'प्राप्त', 'पोस्ट अनुरोधों के, है आदि ...

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