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



node.js http-headers (1)

मेरे नेटवर्क में दो अलग-अलग डोमेन के बीच नोडजे सर्वर पर एक एक्स्टजेएस 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);
});

https://code.i-harness.com


आपके सर्वर में सीओआरएस और एचटीटीपीएस दोनों के साथ समस्या हो सकती है ... आपको सीओआरएस भाग के लिए इस मिडलवेयर की कोशिश करनी चाहिए, और इसे पहले कच्चे 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 विकल्प को प्रॉक्सी के बजाय स्टोर पर लागू किया गया था (इसलिए इसे अनदेखा कर दिया गया था)





cors