जब मेरा जावास्क्रिप्ट कोड करता है तो पोस्टमैन को "नहीं 'एक्सेस-कंट्रोल-अलाउंस-ओरिजिन' हेडर अनुरोधित संसाधन पर मौजूद होता है।"


2500

मॉड नोट : यह प्रश्न इस बारे में है कि पोस्टमैन उसी तरह एक XMLHttpRequest को कोर प्रतिबंधों के अधीन क्यों नहीं है। यह प्रश्न "नो-एक्सेस-कंट्रोल-अलाउंस-ओरिजिन" ... को ठीक करने के तरीके के बारे में नहीं है

कृपया पोस्ट करना बंद करें :

  • सूर्य के नीचे हर भाषा / ढांचे के लिए CORS विन्यास। इसके बजाय अपनी प्रासंगिक भाषा / रूपरेखा का प्रश्न खोजें
  • 3 पार्टी सेवाएं जो कॉर्स को दरकिनार करने का अनुरोध करती हैं
  • विभिन्न ब्राउज़रों के लिए कॉर्स को बंद करने के लिए कमांड लाइन विकल्प

मैं RESTful API बिल्ट-इन फ्लास्क से कनेक्ट करके जावास्क्रिप्ट का उपयोग करके प्राधिकरण करने की कोशिश कर रहा हूं । हालाँकि, जब मैं अनुरोध करता हूं, मुझे निम्नलिखित त्रुटि मिलती है:

XMLHttpRequest http: // myApiUrl / लॉगिन लोड नहीं कर सकता । अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' हेडर मौजूद नहीं है। उत्पत्ति 'अशक्त' इसलिए पहुंच की अनुमति नहीं है।

मुझे पता है कि एपीआई या रिमोट संसाधन हेडर को सेट करना होगा, लेकिन जब मैंने क्रोम एक्सटेंशन पोस्टमैन के माध्यम से अनुरोध किया था तो यह काम क्यों किया था ?

यह अनुरोध कोड है:

$.ajax({
    type: "POST",
    dataType: 'text',
    url: api,
    username: 'user',
    password: 'pass',
    crossDomain : true,
    xhrFields: {
        withCredentials: true
    }
})
    .done(function( data ) {
        console.log("done");
    })
    .fail( function(xhr, textStatus, errorThrown) {
        alert(xhr.responseText);
        alert(textStatus);
    });

32
क्या आप लोकलहोस्ट से अनुरोध कर रहे हैं या HTML को गंभीर रूप से निष्पादित कर रहे हैं?
एमडी। साहिब बिन महबूब

@ MD.SahibBinMahboob यदि मैं आपके प्रश्न को समझता हूं तो मैं लोकलहोस्ट से अनुरोध करता हूं - मेरे पास मेरे कंप्यूटर पर पेज है और बस इसे चलाएं। जब मैं होस्टिंग पर साइट को तैनात करता हूं तो यह उसी परिणाम देता है।
श्री जेडी

6
बहुत संबंधित: stackoverflow.com/questions/10143093/…
cregox

8
अधिक पढ़ने की तलाश में किसी के लिए, MDN के पास ajax और क्रॉस ऑरिजिनल रिक्वेस्ट के बारे में एक अच्छा लेख है: developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
सैम ईटन

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

जवाबों:


1343

अगर मुझे यह ठीक से समझ में आ गया है कि आप XMLHttpRequest एक अलग डोमेन पर कर रहे हैं तो आपका पेज चालू है। इसलिए ब्राउज़र इसे अवरुद्ध कर रहा है क्योंकि यह आमतौर पर सुरक्षा कारणों के लिए एक ही मूल में अनुरोध की अनुमति देता है। जब आप क्रॉस-डोमेन अनुरोध करना चाहते हैं तो आपको कुछ अलग करना होगा। कैसे प्राप्त करने के बारे में एक ट्यूटोरियल कॉर्स का उपयोग कर रहा है

जब आप पोस्टमैन का उपयोग कर रहे हैं तो वे इस नीति द्वारा प्रतिबंधित नहीं हैं। क्रॉस-ऑरिजिन XMLHttpRequest से उद्धृत :

नियमित वेब पेज दूरस्थ सर्वर से डेटा भेजने और प्राप्त करने के लिए XMLHttpRequest ऑब्जेक्ट का उपयोग कर सकते हैं, लेकिन वे एक ही मूल नीति द्वारा सीमित हैं। एक्सटेंशन इतने सीमित नहीं हैं। कोई एक्सटेंशन दूरस्थ सर्वर से इसके मूल के बाहर बात कर सकता है, जब तक कि यह पहली बार क्रॉस-मूल अनुमतियों का अनुरोध करता है।


7
आप सही हे। मैं अपने पृष्ठ से अलग डोमेन के लिए अनुरोध कर रहा हूं। एपीआई सर्वर पर है और मैं लोकलहोस्ट से अनुरोध चलाता हूं। इससे पहले कि मैं उत्तर स्वीकार करूं आप मुझे समझा सकते हैं कि "अनुरोध को सीधे निष्पादित करना" क्या है? POSTMAN डोमेन का उपयोग नहीं करते हैं?
मि। जेडी

180
ब्राउज़र अनुरोध को रोक नहीं रहा है। एकमात्र ब्राउज़र जो एकमुश्त क्रॉस-ऑरिजेंट अजाक्स अनुरोधों को IE7 या अधिक पुराना करते हैं। IE7 और पुराने के अलावा सभी ब्राउज़र, CORS कल्पना (IE8 और IE9 आंशिक रूप से) को लागू करते हैं। आपको केवल अनुरोध के आधार पर उचित हेडर वापस करके अपने एपीआई सर्वर पर कॉर्स अनुरोधों को ऑप्ट-इन करना होगा। आपको mzl.la/VOFrSz पर CORS अवधारणाओं पर पढ़ना चाहिए । पोस्टमैन XHR के माध्यम से भी अनुरोध भेजता है। यदि आप पोस्टमैन का उपयोग करते समय समान समस्या नहीं देख रहे हैं, तो इसका मतलब है कि आप अनजाने में पोस्टमैन के माध्यम से एक ही अनुरोध नहीं भेज रहे हैं।
रे निकोलस

10
@ MD.SahibBinMahboob पोस्टमैन "आपके जावा / अजगर" कोड से अनुरोध नहीं भेज रहा है। यह सीधे ब्राउज़र से अनुरोध भेज रहा है। क्रोम एक्सटेंशन में XHR थोड़ा अलग तरीके से काम करता है, खासकर जब क्रॉस-ऑरिजनल रिक्वेस्ट शामिल होती है
रे निकोलस

249

चेतावनी: का उपयोग करते हुए Access-Control-Allow-Origin: *अपने एपीआई / वेबसाइट कमजोर करने के लिए कर सकते हैं क्रॉस साइट अनुरोध जालसाजी (CSRF) हमला करता है। सुनिश्चित करें कि आप इस कोड का उपयोग करने से पहले जोखिमों को समझते हैं

यदि आप PHP का उपयोग कर रहे हैं तो यह हल करना बहुत आसान है । बस अपने PHP पेज की शुरुआत में निम्नलिखित स्क्रिप्ट जोड़ें जो अनुरोध को संभालती है:

<?php header('Access-Control-Allow-Origin: *'); ?>

यदि आप Node-red का उपयोग कर रहे हैं, तो आपको निम्नलिखित पंक्तियों को अन-कमेंट करके फाइल में CORS की अनुमति देनी होगी node-red/settings.js:

// The following property can be used to configure cross-origin resource sharing
// in the HTTP nodes.
// See https://github.com/troygoode/node-cors#configuration-options for
// details on its contents. The following is a basic permissive set of options:
httpNodeCors: {
 origin: "*",
 methods: "GET,PUT,POST,DELETE"
},

यदि आप फ्लास्क का उपयोग प्रश्न के समान कर रहे हैं ; आपको पहले स्थापित करना हैflask-cors

$ pip install -U flask-cors

फिर अपने आवेदन में फ्लास्क कोर शामिल करें।

from flask_cors import CORS

एक साधारण आवेदन की तरह दिखेगा:

from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

@app.route("/")
def helloWorld():
  return "Hello, cross-origin-world!"

अधिक जानकारी के लिए, आप फ्लास्क प्रलेखन की जांच कर सकते हैं ।


93
और यह सुरक्षित नहीं है
llazzaro

153
आपको कॉर्स को बंद नहीं करना चाहिए क्योंकि आप नहीं जानते कि इसके लिए क्या है। यह एक भयानक जवाब है।
meagar

124
भले ही यह सुरक्षित न हो, लेकिन सवाल सुरक्षा के बारे में नहीं था, लेकिन कार्य को पूरा करने का तरीका था। यह उन विकल्पों में से एक है जो एक डेवलपर को क्रॉस-डोमेन AJAX अनुरोधों के साथ काम करते समय चुनना पड़ता है। इसने मुझे समस्या को हल करने में मदद की, और मेरे आवेदन के लिए, मुझे परवाह नहीं है कि डेटा कहाँ से आया है। मैं गंतव्य डोमेन पर PHP के साथ सभी इनपुट को पवित्र करता हूं, इसलिए, अगर कोई इसे कुछ जंक पोस्ट करना चाहता है, तो उन्हें कोशिश करने दें। यहाँ मुख्य बिंदु यह है, क्रॉस-डोमेन AJAX को गंतव्य डोमेन से अनुमति दी जा सकती है। उत्तर के लिए +1।
ज़ुरावेब

23
जबकि मैं सहमत हूँ कि सामान्य संदेश पिएरो दे रहा है, कि यह विशेष रूप से सुरक्षा के बारे में नहीं है, लेकिन सुरक्षा एक चिंता का विषय है। मुझे लगता है कि इसे कम से कम कुछ कहना चाहिए था "यह आम तौर पर बुरा है! ऐसा मत करो जब तक आप यह नहीं जानते कि आप क्या कर रहे हैं! यहां इस पर अधिक प्रलेखन है: ...", और शायद संक्षेप में बताएं कि क्यों। मैं यहाँ आने के लिए किसी से नफरत करूंगा और बस यही सोचूंगा कि "ओह, मैं इस हेडर को एडजस्ट / एडजस्ट कर सकता हूं और मैं अच्छा हूं!" और पूरी जानकारी नहीं है। मेरा मतलब है, यह उन पर अनुसंधान और सभी के लिए तरह है, लेकिन अभी भी है।
थॉमस एफ।

4
मुझे यह उत्तर पसंद है ... मेरे पास एक ही मुद्दा है और यह इसे हल करता है ... उन्होंने बताया कि कुछ सुरक्षा मुद्दे हैं, लेकिन यह एक और समस्या है और हर व्यक्ति को इस मुद्दे को सोचने और हल करने दें ...
ऐरी वेसबर्ग

63

क्योंकि
$ .ajax ({प्रकार: "POST" - विकल्प
$ .post ( - कॉल POST) कहता है

दोनों अलग हैं। पोस्टमैन "POST" को ठीक से कॉल करता है, लेकिन जब हम इसे कॉल करते हैं, तो यह "विकल्प" होगा।

सी # वेब सेवाओं के लिए - वेब एपीआई

कृपया <system.webServer> टैग के तहत अपने web.config फ़ाइल में निम्न कोड जोड़ें । यह काम करेगा:

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
    </customHeaders>
</httpProtocol>

कृपया सुनिश्चित करें कि आप अजाक्स कॉल में कोई गलती नहीं कर रहे हैं

jQuery

$.ajax({
    url: 'http://mysite.microsoft.sample.xyz.com/api/mycall',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    },
    type: "POST", /* or type:"GET" or type:"PUT" */
    dataType: "json",
    data: {
    },
    success: function (result) {
        console.log(result);
    },
    error: function () {
        console.log("error");
    }
});

नोट: यदि आप किसी तृतीय-पक्ष वेबसाइट से सामग्री डाउनलोड करने के लिए देख रहे हैं तो यह आपकी मदद नहीं करेगा । आप निम्न कोड आज़मा सकते हैं, लेकिन जावास्क्रिप्ट नहीं।

System.Net.WebClient wc = new System.Net.WebClient();
string str = wc.DownloadString("http://mysite.microsoft.sample.xyz.com/api/mycall");

इस कॉन्फ़िगरेशन ने Azure Services पर Wordpress पर समान त्रुटि हल की। धन्यवाद।
आंद्रे मेसक्विता

9
मैं बाहरी डोमेन से अनुरोधों से बचने के लिए एक विशिष्ट मूल मान का उपयोग करने का सुझाव दूंगा। इसलिए *उपयोग के बजाय उदाहरण के लिएhttps://www.myotherdomain.com
pechar


8

एक CorS प्रतिबंध लागू करना एक सर्वर द्वारा परिभाषित और ब्राउज़र द्वारा कार्यान्वित सुरक्षा सुविधा है

ब्राउज़र सर्वर की CORS नीति को देखता है और उसका सम्मान करता है।

हालाँकि, पोस्टमैन उपकरण सर्वर के कोर नीति के बारे में परेशान नहीं करता है।

यही कारण है कि ब्राउज़र में CORS त्रुटि दिखाई देती है, लेकिन पोस्टमैन में नहीं।


1
हां, मैं इस बात पर जोर नहीं दे सकता कि यह थोड़ा विस्तार क्यों ध्यान देने योग्य है। सुरक्षा की बात करते समय इसके सर्वोपरि यह उल्लेख करने के लिए कि कोर केवल उतना ही मजबूत है जितना कि इसे लागू करने वाला ग्राहक । तो कल्पना करें कि आप एक साधारण HttpClient (सर्वर-साइड कोड) लेते हैं और एक प्रॉक्सी का निर्माण करते हैं, जिसे तब आपके अनुरोध करता है ... सुरक्षा पूरी तरह से दरकिनार की जा सकती है, वास्तव में एक खराब समाधान के रूप में कोरस मानक को छोड़कर
क्रिस्टोफर बोनिट्स

7

एपीआई के रूप में नीचे दी गई जांच में, मैं आपके प्रश्न से http: // myApiUrl / लॉगिन के बजाय http://example.com का उपयोग करता हूं , क्योंकि यह पहला काम है।

मुझे लगता है कि आपका पृष्ठ http: //my-site.local: 8088 पर है

अलग-अलग परिणाम देखने का कारण यह है कि पोस्टमैन:

  • हेडर सेट करें Host=example.com(आपका एपीआई)
  • हेडर सेट नहीं है Origin

यह ब्राउज़र के अनुरोध भेजने के तरीके के समान है जब साइट और एपीआई में एक ही डोमेन होता है (ब्राउज़र हेडर आइटम भी सेट करता है Referer=http://my-site.local:8088, हालांकि मैं इसे पोस्टमैन में नहीं देखता हूं)। जब Originहेडर सेट नहीं होता है, तो आमतौर पर सर्वर डिफ़ॉल्ट रूप से ऐसे अनुरोधों की अनुमति देते हैं।

यहां छवि विवरण दर्ज करें

यह मानक तरीका है कि पोस्टमैन अनुरोध कैसे भेजता है। लेकिन जब आपकी साइट और API में अलग-अलग डोमेन होते हैं , तो एक ब्राउज़र अलग-अलग अनुरोध भेजता है , और फिर CORS होता है और ब्राउज़र स्वचालित रूप से:

  • हेडर सेट करता है Host=example.com(आपका एपीआई के रूप में)
  • शीर्ष लेख Origin=http://my-site.local:8088(आपकी साइट)

(हेडर के रूप Refererमें एक ही मूल्य है Origin)। और अब Chrome के कंसोल और नेटवर्क टैब में आप देखेंगे:

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

जब आपके पास Host != Originयह कॉर्स होता है, और जब सर्वर इस तरह के अनुरोध का पता लगाता है, तो यह आमतौर पर इसे डिफ़ॉल्ट रूप से ब्लॉक करता है

Origin=nullजब आप HTML सामग्री को किसी स्थानीय निर्देशिका से खोलते हैं, और यह एक अनुरोध भेजता है। ऐसी ही स्थिति तब होती है जब आप <iframe>नीचे दिए गए स्निपेट की तरह एक अनुरोध भेजते हैं (लेकिन यहां Hostहेडर बिल्कुल सेट नहीं है) - सामान्य तौर पर, हर जगह HTML विनिर्देशन अपारदर्शी मूल कहता है, आप इसका अनुवाद कर सकते हैं Origin=null। इसके बारे में अधिक जानकारी आप यहां पा सकते हैं ।

fetch('http://example.com/api', {method: 'POST'});
Look on chrome-console > network tab

यदि आप एक सरल CORS अनुरोध का उपयोग नहीं करते हैं, तो आमतौर पर ब्राउज़र स्वचालित रूप से मुख्य अनुरोध भेजने से पहले एक विकल्प अनुरोध भी भेजता है - अधिक जानकारी यहाँ है । नीचे दिया गया स्निपेट यह दिखाता है:

fetch('http://example.com/api', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json'}
});
Look in chrome-console -> network tab to 'api' request.
This is the OPTIONS request (the server does not allow sending a POST request)

आप CORS अनुरोधों की अनुमति देने के लिए अपने सर्वर के कॉन्फ़िगरेशन को बदल सकते हैं।

यहां एक उदाहरण कॉन्फ़िगरेशन है जो कॉर्न्स को nginx (nginx.conf फ़ाइल) पर चालू करता है - always/"$http_origin"nginx और "*"Apache के लिए सेटिंग के साथ बहुत सावधान रहें - यह किसी भी डोमेन से CORS को अनब्लॉक करेगा।

यहाँ एक उदाहरण विन्यास है जो अपाचे (.htaccess फ़ाइल) पर CORS को चालू करता है


2

विभिन्न उपयोग के मामले में एक ही त्रुटि का सामना करना पड़ा।

केस का उपयोग करें: क्रोम में जब कोन रेस्ट एंड पॉइंट को कोणीय में बुलाने की कोशिश की जाती है ।

यहां छवि विवरण दर्ज करें

समाधान: संबंधित नियंत्रक वर्ग के शीर्ष पर @CrossOrigin ("*") एनोटेशन जोड़ें ।

यहां छवि विवरण दर्ज करें


मैं सुरक्षा के लिए * के बजाय लोकलहोस्ट का उपयोग करता हूं
neo7bf

-1

यदि आप .NET को अपने मध्य स्तरीय के रूप में उपयोग करते हैं, तो मार्ग विशेषता को स्पष्ट रूप से जांचें, उदाहरण के लिए,

जब यह इस तरह का था, तब मैंने इसे जारी किया था।

[Route("something/{somethingLong: long}")] //Space.

इसे इसके द्वारा निर्धारित करें,

[Route("something/{somethingLong:long}")] //No space

-1

केवल .NET कोर वेब एपीआई परियोजना के लिए, निम्नलिखित परिवर्तन जोड़ें:

  1. Startup.cs फ़ाइल services.AddMvc()की ConfigureServices()विधि में लाइन के बाद निम्न कोड जोड़ें :
services.AddCors(allowsites=>{allowsites.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin());
            });
  1. Startup.cs फ़ाइल app.UseMvc()की Configure()विधि में लाइन के बाद निम्न कोड जोड़ें :
app.UseCors(options => options.AllowAnyOrigin());
  1. वह नियंत्रक खोलें जिसे आप डोमेन के बाहर एक्सेस करना चाहते हैं और नियंत्रक स्तर पर इस निम्नलिखित विशेषता को जोड़ें:
[EnableCors("AllowOrigin")]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.