HTML5 fetch API का उपयोग करके Access-Control-Allow-Origin हेडर की अनुमति दें


87

मैं HTML5 fetch API का उपयोग कर रहा हूं।

var request = new Request('https://davidwalsh.name/demo/arsenal.json');

fetch(request).then(function(response) {
    // Convert to JSON
    return response.json();
}).then(function(j) {
    // Yay, `j` is a JavaScript object
    console.log(JSON.stringify(j));
}).catch(function(error) {
    console.log('Request failed', error)
});

मैं सामान्य जसन का उपयोग करने में सक्षम हूं लेकिन उपरोक्त एपि यूआरएल के डेटा को लाने में असमर्थ हूं। यह त्रुटि फेंकता है:

Fetch API https://davidwalsh.name/demo/arsenal.json लोड नहीं कर सकता । अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' हेडर मौजूद नहीं है। उत्पत्ति ' http: // localhost ' इसलिए पहुँच की अनुमति नहीं है। यदि एक अपारदर्शी प्रतिक्रिया आपकी आवश्यकताओं को पूरा करती है, तो संसाधन को अक्षम करने के लिए 'नो-कॉर्स' के लिए अनुरोध के मोड को सेट करें।


3rd पार्टी सर्वर को इसे सेट करने की आवश्यकता है, क्लाइंटसाइड पर आप कुछ भी नहीं कर सकते हैं।
एपस्केलरेलो

@epascarello: हम ग्राहक की ओर से कर सकते हैं। दृश्य के पीछे, एक्सएचआर अनुरोध चल रहा है। कृपया इसे देखेंhttps://davidwalsh.name/fetch
iNikkz

जवाबों:


81

जैसे epascarello ने कहा, संसाधन को होस्ट करने वाले सर्वर को CORS सक्षम होना चाहिए। आप क्लाइंट की तरफ क्या कर सकते हैं (और शायद आप क्या सोच रहे हैं) को CORS में लाने का तरीका सेट किया गया है (हालाँकि यह डिफ़ॉल्ट सेटिंग है जो मुझे विश्वास है):

fetch(request, {mode: 'cors'});

हालाँकि इसके लिए सर्वर को अभी भी कॉर्स को सक्षम करने की आवश्यकता है, और अपने डोमेन को संसाधन का अनुरोध करने की अनुमति दें।

की जाँच करें CORS प्रलेखन , और इस भयानक Udacity वीडियो समझा ही उत्पत्ति नीति

आप ग्राहक पक्ष पर नो-कॉर्स मोड का भी उपयोग कर सकते हैं, लेकिन यह आपको केवल एक अपारदर्शी प्रतिक्रिया देगा (आप शरीर को नहीं पढ़ सकते हैं, लेकिन प्रतिक्रिया अभी भी एक सेवा कार्यकर्ता द्वारा कैश की जा सकती है या कुछ एपीआई द्वारा खपत की जा सकती है, जैसे <img>) :

fetch(request, {mode: 'no-cors'})
.then(function(response) {
  console.log(response); 
}).catch(function(error) {  
  console.log('Request failed', error)  
});

2
क्या आप "हालांकि इसके बाद भी सर्वर को कोर को सक्षम करने और संसाधन का अनुरोध करने के लिए अपने डोमेन को अनुमति देने की आवश्यकता है" पर विस्तार से बता सकते हैं? मैं ऐसा करने के लिए निर्देशों की असफल खोज कर रहा हूं।
जावास्क्रिप्ट

2
@jayscript समग्र प्रक्रिया इस तरह दिखती है: क्लाइंट पर, जावास्क्रिप्ट के साथ एक क्रॉस मूल अनुरोध किया जाता है। लाने के मामले में, 'cors' मोड ब्राउज़र को बताता है कि यह अनुरोध करने के लिए ठीक है। यदि आपके पास इसके बजाय 'नो-कोर्स' मोड है, तो ब्राउज़र अनुरोध को रोक देगा, क्योंकि यह आपके ऐप की उत्पत्ति के लिए नहीं है। सर्वर अनुरोध प्राप्त करेगा और प्रतिक्रिया देगा। ब्राउज़र पुष्टि की है कि उत्तर उचित CORS हेडर है, और यदि हां, तो प्रतिक्रिया पढ़ने के लिए अनुमति देता है। यदि हेडर मौजूद नहीं हैं, तो ब्राउज़र एक त्रुटि फेंक देगा।
डेविड स्केल

1
@jayscript यह एमडीएन लेख विस्तार से जाता है। अनिवार्य रूप से, आपका एक सर्वर जिसे आपको इन हेडरों को सेट करने की आवश्यकता है: "एक्सेस-कंट्रोल- अलाउंस -ओरिजिन: foo.example ", "एक्सेस-कंट्रोल- एलाउंस -मेथड्स: पोस्ट, जीईटी, ऑप्शन्स ", "एक्सेस-कंट्रोल- अलाउंस - हेडर्स : एक्स-पिंगोथेर, सामग्री-प्रकार ", जो क्रमशः उत्पत्ति, विधियों और हेडर को सक्षम करते हैं। आमतौर पर '*' का उपयोग मूल हेडर के लिए किया जाता है। आप Fetch API: Developers.google.com/web/ilt/pwa/working-with-the-fetch-api
डेविड स्केल

2
धन्यवाद! यह समझने में मेरी मदद करता है कि एपीआई सर्वर से डेटा प्राप्त करना असंभव है, जिसमें एक अलग मूल है जब एपीआई सर्वर में कोई हेडर नहीं होता है। जिस विशेष मामले में मैं काम कर रहा था, मेरे पास एपीआई सर्वर कोड तक पहुंच थी और खुद से हेडर जोड़ने में सक्षम था, जो कि सक्षम बनाता था।
11:15 बजे jayscript

यह गूंगा है, NO sendingकुकीज़ के साथ सुरक्षा का मुद्दा क्या है और इस तरह कॉर्स की अनुमति है?
deathangel908

14

मेरे पास http: // localhost: 3000 में मेरा फ्रंट-एंड कोड चल रहा था और http: //hosthost पर मेरा एपीआई (बैकएंड कोड) चल रहा था : 5000

API को कॉल करने के लिए fetch API का उपयोग कर रहा था। प्रारंभ में, यह "cors" त्रुटि फेंक रहा था। फिर इस बैक कोड को मेरे बैकएंड एपीआई कोड में जोड़ा, जिससे कहीं से भी मूल और हेडर की अनुमति मिल सके।

let allowCrossDomain = function(req, res, next) {
  res.header('Access-Control-Allow-Origin', "*");
  res.header('Access-Control-Allow-Headers', "*");
  next();
}
app.use(allowCrossDomain);

हालाँकि आपको मंच, ठेस जैसे अन्य वातावरण के मामले में मूल उत्पत्ति को प्रतिबंधित करना चाहिए।


20
यह एक भयानक जवाब है। यह एक भारी सुरक्षा मुद्दा है। यदि आप इसे पढ़ रहे हैं, तो कृपया यह मत करो।
mjones.udri

1
यह स्थानीय सेटअप के लिए गीत है। उदाहरण के लिए एक त्वरित तस्वीर थोड़े करने के लिए। हाँ, यदि कोई अन्य सुरक्षा वातावरण के लिए जाता है तो सुरक्षा जोखिम है। स्थानीय लोगों के लिए मुझे ऐसा नहीं लगता। "हालांकि आपको मंच, ठेस जैसे अन्य वातावरण के मामले में आपको मूल प्रतिबंधित करना चाहिए"
smsivaprakaash

12

यह मेरे लिए काम किया:

npm install -g local-cors-proxy

एपीआई एंडपॉइंट जो हम अनुरोध करना चाहते हैं कि कोर मुद्दे हैं:

https://www.yourdomain.com/test/list

प्रारंभ प्रॉक्सी:

lcp --proxyUrl https://www.yourdomain.com

 Proxy Active 

 Proxy Url: http://www.yourdomain.com:28080
 Proxy Partial: proxy
 PORT: 8010

फिर आपके ग्राहक कोड में, नया API समापन बिंदु:

http://localhost:8010/proxy/test/list

अंतिम परिणाम https://www.yourdomain.ie/test/list के लिए CORS मुद्दों के बिना एक अनुरोध होगा !


Pls सुनिश्चित करें कि सर्वर समानांतर चल रहा है खुली खुली सीएमटी-प्रॉम्प्ट विंडो की तरह और कोड चलाएं lcp --proxyUrl yourdomain.com
गोवर्धनन वेणुनाथन

8

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैंने पाया कि इस त्रुटि को ठीक करने के लिए मैंने जो काम किया है वह मेरे सर्वर के आईपी पते का उपयोग करने के बजाय मेरे डोमेन अनुरोध के भीतर डोमेन नाम का उपयोग कर रहा है। उदाहरण के लिए:

#(original) var request = new Request('https://davidwalsh.name/demo/arsenal.json');
#use IP instead
var request = new Request('https://0.0.0.0/demo/arsenal.json');

fetch(request).then(function(response) {
    // Convert to JSON
    return response.json();
}).then(function(j) {
    // Yay, `j` is a JavaScript object
    console.log(JSON.stringify(j));
}).catch(function(error) {
    console.log('Request failed', error)
});

1

यदि आप उपयोग कर रहे हैं nginx यह कोशिश करो

#Control-Allow-Origin access

    # Authorization headers aren't passed in CORS preflight (OPTIONS) calls. Always return a 200 for options.
    add_header Access-Control-Allow-Credentials "true" always;
    add_header Access-Control-Allow-Origin "https://URL-WHERE-ORIGIN-FROM-HERE " always;
    add_header Access-Control-Allow-Methods "GET,OPTIONS" always;
    add_header Access-Control-Allow-Headers "x-csrf-token,authorization,content-type,accept,origin,x-requested-with,access-control-allow-origin" always;

    if ($request_method = OPTIONS ) {
        return 200;
    }


-3

Https://expressjs.com/en/resources/middleware/cors.html को देखें। आपको कॉर्स का उपयोग करना होगा।

इंस्टॉल:

$ npm install cors
const cors = require('cors');
app.use(cors());

आपको इस कोड को अपने नोड सर्वर में डालना होगा।


1
आप यह कैसे जान सकते हैं कि यह ओपी का सर्वर है और इसे NodeJs में लिखा गया है?
मारेक स्ज़ुदेल्स्की

यदि आपने एक नोड सर्वर (विकास मोड) बनाया है, तो आप उस विधि का उपयोग js में कर सकते हैं।
एरनेरस्टो पास्तोरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.