ajax - CORS अंक जब ExtJS से नोड.जेएस तक अनुरोध करते हैं। अनुरोध या उत्तर हैडर गलत?




node.js http-headers (2)

आपके सर्वर में सीओआरएस और एचटीटीपीएस दोनों के साथ समस्या हो सकती है ... आपको सीओआरएस भाग के लिए इस मिडलवेयर की कोशिश करनी चाहिए, और इसे पहले कच्चे HTTP में पेज तक पहुंचते समय काम करना चाहिए। जहाँ तक मुझे पता है, आपको HTTP और HTTPS के लिए अलग-अलग बंदरगाहों का उपयोग करना होगा। और आपको शायद कॉरस क्रेडेंशियल को सक्षम करने की आवश्यकता होगी जैसा कि मैंने कहा, मुझे लगता है कि आप इसे पहले बेहतर HTTP में काम करना चाहते हैं;)

उसके बाद, Ext part पर, जैसा कि पहले से ही टिप्पणी में उल्लिखित है, आपको शायद डिफॉल्ट हेडर अक्षम करना चाहिए (या आपको अपने सर्वर द्वारा स्वीकार किए जाने वाले सभी को बनाना होगा, इस उत्तर में पहली टिप्पणी देखें)। लेकिन आपको प्रॉक्सी पर ऐसा करने की आवश्यकता है, क्योंकि जाहिरा तौर पर यह Ext.Ajax में वैश्विक सेटिंग को बदल देता है

तो, ऐसा कुछ:

Ext.create('Ext.data.Store', {
    id         : 'countryStore',
    model      : 'country',
    autoLoad   : true,
    autoDestroy: true,
    proxy: {
        type: 'rest',
        url : 'https://restcountries.eu/rest/v1/all',
        useDefaultXhrHeader: false, // <= HERE
        reader: {
            type           : 'json',
            headers: {'Accept': 'application/json'},
            totalProperty  : 'total',
            successProperty: 'success',
            messageProperty: 'message'
        }
    } // <= and notice this change
});

शायद असंबंधित है, लेकिन ध्यान दें कि आपका आक्षेप गलत था और इस तथ्य को छिपा दिया था कि reader विकल्प को प्रॉक्सी के बजाय स्टोर पर लागू किया गया था (इसलिए इसे अनदेखा कर दिया गया था)

मेरे नेटवर्क में दो अलग-अलग डोमेन के बीच नोडजे सर्वर पर एक एक्स्टजेएस AJAX अनुरोध बनाने में समस्याएं हो रही हैं और किसी भी मदद की सराहना होगी। ExtJS क्लाइंट साइड से http और https दोनों से प्रयास करते समय उत्तर विफल रहता है, लेकिन मेरे लोकल से एक कर्ल http द्वारा रिटर्न 200 सही डेटा के साथ ठीक है। हम सामग्री प्रकार application/json साथ काम कर रहे हैं।

ExtJS पर आरडी फ़ंक्शन ने सीओआरएस को सक्षम किया है:

Ext.onReady(function () {
   Ext.Ajax.cors = true;
   Ext.Ajax.useDefaultXhrHeader = false;
   ... (code removed) 
})

एक एक्स्टजेएस क्लाइंट साइड से एक ज्ञात कार्य यूआरएल पर एक टेस्ट जो ठीक से एक्स्टजेएस डाटास्टोर बनायेगा (200 ओके वापस लाएगा):

Ext.create('Ext.data.Store', {
    id         : 'countryStore',
    model      : 'country',
    autoLoad   : true,
    autoDestroy: true,
    proxy: {
        type: 'rest',
        url : 'https://restcountries.eu/rest/v1/all',
        },
        reader: {
            type           : 'json',
            headers: {'Accept': 'application/json'},
            totalProperty  : 'total',
            successProperty: 'success',
            messageProperty: 'message'
        }
});

हालांकि, जब हमारे नोडजेएस सर्वर से अनुरोध करने का प्रयास करते हैं

http :

Ext.create('Ext.data.Store', {
    id         : 'circuits',
    model      : 'circuit',
    autoLoad   : true,
    autoDestroy: true,
    proxy: {
        type: 'rest',
        url : 'http://ourNodeJsServerDomain:5500/v3/circuits',
        },
        reader: {
            type           : 'json',
            headers: {'Accept': 'application/json'},
            totalProperty  : 'total',
            successProperty: 'success',
            messageProperty: 'message'
        }
});

Chrome के कंसोल में निम्न देता है:

Mixed Content: The page at 'https://ourExtJsDevClientSide' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://ourNodeJsServerDomain:5500/v3/circuits?_dc=1430149427032&page=1&start=0&limit=50'. This request has been blocked; the content must be served over HTTPS.

अब, जब https पर प्रयास किया गया:

फ़ायरफ़ॉक्स दिखाता है:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://ourNodeJsServerDomain:5500/v3/circuits?_dc=1430151516741&page=1&start=0&limit=50. This can be fixed by moving the resource to the same domain or enabling CORS.

और अनुरोध हैडर "आवेदन / जेएसन" नहीं दिखाता, क्या यह एक मुद्दा है ?:

Accept  
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding 
gzip, deflate
Accept-Language 
en-US,en;q=0.5
Host    
ourNodeJsServerDomain:5500
Origin  
https://ourExtJsDevClientSide
Referer 
https://ourExtJsDevClientSide
User-Agent  
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Gecko/20100101 Firefox/37.0

मैंने तब कर्ल के साथ की कोशिश की कि यह देखने के लिए कि प्रतिक्रियाएं डिबग कैसे मदद करती हैं

http पर 200 http देता है, लेकिन एक्सेस-कंट्रोल-अनुमति-उत्पत्ति भी अनिश्चित है, जब भी हम इसे "*" रूप में परिभाषित कर रहे हैं:

curl http://ourNodeJsServerDomain:5500/v3circuits?_limit=1 -v
> GET /v3/circuits?_limit=1 HTTP/1.1
> User-Agent: curl/7.37.1
> Host: ourNodeJsServerDomain:5500
> Accept: */*
> 
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Access-Control-Allow-Origin: undefined
< Access-Control-Allow-Methods: GET
< Access-Control-Allow-Headers: Content-Type
< Content-Type: application/json; charset=utf-8
< Content-Length: 1126
< ETag: W/"MlbRIlFPCV6w7+PmPoVYiA=="
< Date: Mon, 27 Apr 2015 16:24:18 GMT
< Connection: keep-alive
< 
[
  { *good json data returned here* } ]

तब जब मैं https माध्यम से curl करने का प्रयास करता हूँ

curl https://ourNodeJsServerDomain:5500/v3/circuits?_limit=1 -v
* Server aborted the SSL handshake
* Closing connection 0
curl: (35) Server aborted the SSL handshake

हमने हमारे नोडज सर्वर पर सीओआरएस को सक्षम किया है:

router
    .all('*', function(req, res, next){
        res.setHeader('Content-Type', 'application/json');
        // res.setHeader("Access-Control-Allow-Origin", req.headers.origin);
        // console.log('\n\nreq.headers.origin ===================== ' + req.headers.origin);
        //I have tried allowing all * via res.SetHeader and res.header and neither is defining the Access-Control-Allow-Origin properly when curling
        //res.setHeader("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Origin", "*");
        // res.header("Access-Control-Allow-Headers", "X-Requested-With");
        res.header('Access-Control-Allow-Methods', 'GET');
        res.header('Access-Control-Allow-Headers', 'Content-Type');

मैंने अपने विचार प्रक्रिया में विस्तृत होने का प्रयास किया है और मैं यह तय करने के लिए नए तरीकों की कोशिश करने को तैयार हूं कि यह कैसे समझें और इसका समाधान करे।

* उपाय *

समस्या ब्राउज़र से मिश्रित सामग्री है। हमारा क्लाइंट यूआई https (सुरक्षित) पर है, जबकि हम nodejs सर्वर से http (असुरक्षित) सामग्री का अनुरोध कर रहे थे हमें हमारे नोडजे सर्वर को https पर चलाने की अनुमति देने की आवश्यकता है

हम SSL प्रमाणपत्र जनरेट कर चुके हैं और उन्हें हमारे नोडज सर्वर पर लागू किया है।

नोडज कोड के भीतर, हमने सीओआरएस मॉड्यूल के साथ सीओआरएस सक्षम किया है और दोनों http और https सर्वर चल रहे हैं:

// enable CORS for all requests
var cors = require('cors');
app.use(cors());

// for certifications
var credentials = {
  key: fs.readFileSync('our.key'),
  cert: fs.readFileSync('our.crt')
};

var httpServer = http.createServer(app);
var httpsServer = https.createServer(credentials, app);

httpServer.listen(port, function() {
console.log('HTTP server listening on port ' + port);
});

httpsServer.listen(httpsPort, function() {
    console.log('HTTPS server listening on port ' + httpsPort);
});

क्रॉस-ओरिजिनल अनुरोध साझाकरण - CORS (एकेए क्रॉस-डोमेन AJAX अनुरोध) एक मुद्दा है कि अधिकांश वेब डेवलपर्स का सामना करना पड़ सकता है, समान-उत्पत्ति-नीति के अनुसार, ब्राउज़र क्लाइंट जावास्क्रिप्ट को सुरक्षा सैंडबॉक्स में प्रतिबंधित करते हैं, आमतौर पर जेएस सीधे रिमोट के साथ संवाद नहीं कर सकता एक अलग डोमेन से सर्वर। पिछले डेवलपर्स में क्रॉस-डोमेन संसाधन अनुरोध प्राप्त करने के कई कठिन तरीके बनाए गए हैं, आमतौर पर तरीकों का उपयोग करने के तरीके हैं:

  1. रिमोट के साथ संवाद करने के लिए फ्लैश / सिल्वरलाइट या सर्वर पक्ष को "प्रॉक्सी" के रूप में उपयोग करें।
  2. पैडिंग के साथ जेएसओएन ( JSONP )।
  3. एक आईफ्रेम में रिमोट सर्वर एम्बेड करता है और खंड या window.name के माध्यम से संवाद करता है, here देखें।

उन मुश्किल तरीकों से कुछ या कम समस्याएं हैं, उदाहरण के लिए जेएसओएनपी का परिणाम सुरक्षा छेद में हो सकता है यदि डेवलपर्स बस इसे "eval" करते हैं, और ऊपर # 3, हालांकि यह काम करता है, दोनों डोमेन एक-दूसरे के बीच सख्त अनुबंध बनाना चाहिए, न तो लचीला और न ही सुरुचिपूर्ण IMHO:)

डब्ल्यू 3 सी ने इस मुद्दे को हल करने के लिए एक सुरक्षित, लचीला और एक अनुशंसित मानक तरीका प्रदान करने के लिए एक मानक समाधान के रूप में क्रॉस-ओरिजिनल रिसोर्स शेयरिंग (सीओआरएस) पेश किया था।

यांत्रिकी

एक उच्च स्तर से हम आसानी से मान सकते हैं कि सीओआरएस डोमेन ए से क्लाइंट AJAX कॉल और डोमेन बी पर होस्ट किए गए एक पृष्ठ के बीच एक अनुबंध है, एक सामान्य क्रॉस-उत्पत्ति अनुरोध / प्रतिक्रिया होगी:

डोमेनए AJAX अनुरोध शीर्षलेख

Host DomainB.com
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json
Accept-Language en-us;
Accept-Encoding gzip, deflate
Keep-Alive 115
Origin http://DomainA.com 

डोमेनबी प्रतिक्रिया शीर्षलेख

Cache-Control private
Content-Type application/json; charset=utf-8
Access-Control-Allow-Origin DomainA.com
Content-Length 87
Proxy-Connection Keep-Alive
Connection Keep-Alive

ऊपर वर्णित नीले रंग के हिस्सों में कर्नल तथ्यों थे, "उत्पत्ति" अनुरोध हेडर "इंगित करता है कि क्रॉस-मूल अनुरोध या प्रीफलाइट अनुरोध" से उत्पन्न होता है, "एक्सेस-कंट्रोल-ऑब्जेक्ट-ओरिजिन" प्रतिक्रिया हेडर इंगित करता है कि यह पृष्ठ दूरस्थ अनुरोध की अनुमति देता है डोमेनए (यदि मान है * संकेत किसी भी डोमेन से रिमोट अनुरोधों की अनुमति देता है)।

जैसा कि मैंने उपरोक्त उल्लेख किया है, डब्ल्यू 3 ने वास्तव में क्रॉस-ओरिजिनल HTTP अनुरोध को सबमिट करने से पहले " प्रीफलाइट अनुरोध " लागू करने के लिए ब्राउज़र की अनुशंसा की है, संक्षेप में यह एक HTTP OPTIONS अनुरोध है:

OPTIONS DomainB.com/foo.aspx HTTP/1.1

यदि foo.aspx विकल्प HTTP क्रिया का समर्थन करता है, तो यह नीचे की तरह प्रतिक्रिया वापस कर सकता है:

HTTP/1.1 200 OK
Date: Wed, 01 Mar 2011 15:38:19 GMT
Access-Control-Allow-Origin: http://DomainA.com
Access-Control-Allow-Methods: POST, GET, OPTIONS, HEAD
Access-Control-Allow-Headers: X-Requested-With
Access-Control-Max-Age: 1728000
Connection: Keep-Alive
Content-Type: application/json

केवल तभी जब प्रतिक्रिया में "एक्सेस-कंट्रोल-ऑब्जेक्ट-ओरिजिनल" होता है और इसका मान "*" होता है या उस डोमेन को शामिल करता है जो सीओआरएस अनुरोध जमा करता है, इस अनिवार्य स्थिति को संतुष्ट करके ब्राउज़र वास्तविक क्रॉस-डोमेन अनुरोध सबमिट करेगा, और परिणाम कैश करेगा " प्रीफलाइट-परिणाम-कैश " में।

मैंने तीन साल पहले सीओआरएस के बारे में ब्लॉग किया: AJAX क्रॉस-उत्पत्ति HTTP अनुरोध





ajax node.js extjs http-headers cors