2012-04-24 23 views
8

पर एक कुकी आधारित सत्र को जारी रखना मेरे पास एक साधारण एक्सप्रेस आधारित Node.js वेब सर्वर है जिसका उपयोग मैं जावास्क्रिप्ट एप्लिकेशन के विकास के लिए कर रहा हूं। मैंने सर्वर को प्रॉक्सी एपीआई अनुरोधों के लिए नोड-एचटीएमएल-प्रॉक्सी का उपयोग करने के लिए सेट अप किया है, एप्लिकेशन एक जेटी सर्वर को बनाता है जो एक अलग डोमेन और पोर्ट पर चल रहा है। जब तक मैं सत्र प्रबंधन के साथ समस्याओं में भागना शुरू नहीं करता तब तक यह सेटअप बेकार ढंग से काम कर रहा है।नोड-http-proxy

प्रमाणीकरण पर एप्लिकेशन सर्वर सर्वर सत्र का प्रतिनिधित्व करने वाले ऑथ टोकन के साथ एक कुकी देता है। जब मैं अपने फाइल सिस्टम से फ़ाइल जेएस एप्लिकेशन चलाता हूं (फ़ाइल: //) मैं देख सकता हूं कि क्लाइंट को कुकी प्राप्त होने के बाद, यह बाद के सभी एपीआई अनुरोधों में भेजा जाता है। जब मैं नोड सर्वर पर जेएस ऐप चलाता हूं और एपीआई कॉल नोड-एचटीएमएल-प्रॉक्सी (रूटिंगिंग प्रॉक्सी) के माध्यम से प्रॉक्सी किया जाता है तो अनुरोध हेडर में कुकी शामिल नहीं होती है।

क्या मुझे प्रॉक्सी के माध्यम से इस प्रकार के सत्र दृढ़ता का समर्थन करने के लिए मैन्युअल रूप से संभालने की आवश्यकता है? मैं नोड-http-प्रॉक्सी कोड के माध्यम से खुदाई कर रहा हूं लेकिन यह मेरे सिर पर थोड़ा सा है क्योंकि मैं नोड में नया हूं।

https://gist.github.com/2475547 या:

var express = require('express'), 
    routingProxy = require('http-proxy').RoutingProxy(), 
    app = express.createServer(); 

var apiVersion = 1.0, 
    apiHost = my.host.com, 
    apiPort = 8080; 

function apiProxy(pattern, host, port) { 
    return function(req, res, next) { 
     if (req.url.match(pattern)) { 
      routingProxy.proxyRequest(req, res, {host: host, port: port}); 
     } else { 
      next(); 
     } 
    } 
} 

app.configure(function() { 
    // API proxy middleware 
    app.use(apiProxy(new RegExp('\/' + apiVersion + '\/.*'), apiHost, apiPort)); 

    // Static content middleware 
    app.use(express.methodOverride()); 
    app.use(express.bodyParser()); 
    app.use(express.static(__dirname)); 
    app.use(express.errorHandler({ 
     dumpExceptions: true, 
     showStack: true 
    })); 
    app.use(app.router); 
}); 

app.listen(3000); 

उत्तर

5

मैंने मैन्युअल रूप से प्रतिक्रिया को देखकर पूछा है कि यह एक सेट-कुकी है, जो JSESSSIONID को बंद कर रहा है, इसे एक चर में संग्रहीत कर रहा है, और इसे हेडर के रूप में बाद के सभी अनुरोधों पर पास कर रहा है। इस तरह रिवर्स प्रॉक्सी एक कुकी के रूप में कार्य करता है।

enter code on('proxyReq', function(proxyReq){ proxyReq.setHeader('cookie', 'sessionid=' + cookieSnippedValue) 
0

आदर्श रूप में एक प्रॉक्सी का काम सिर्फ आगे के गंतव्य के लिए एक अनुरोध है, और कुकी जैसे महत्वपूर्ण हैडर को बंद पट्टी नहीं करना चाहिए, लेकिन अगर यह है, मुझे लगता है कि आप दर्ज करनी चाहिए उनके खिलाफ एक मुद्दा https://github.com/nodejitsu/node-http-proxy/issues

इसके अलावा आपने कहा है कि अनुरोध शीर्षलेखों में कभी कुकी शामिल नहीं है, क्या यह संभव है कि क्लाइंट इसे कभी प्राप्त न हो?

+0

मैंने वेब इंस्पेक्टर में पुष्टि की है कि क्लाइंट 'सेट-कुकी' हेडर प्राप्त करता है। आप लेनदेन देख सकते हैं [यहां] (http://i.imgur.com/VQV0a.png)।इस मामले में अनुरोध कुकी एक्सप्रेस के कुकी पार्सर द्वारा उत्पन्न की जा रही है जिसे मैं सत्र का समर्थन करने के लिए उपयोग करने का प्रयास कर रहा था लेकिन ऐसा लगता है कि यह हमेशा अपनी चीज करता है। – tomswift

+0

गिटहब में एक मुद्दा खोल दिया क्योंकि मैं प्रॉक्सी सर्वर की प्रतिक्रिया से कुकी को प्राप्त करने और प्राप्त करने के लिए संघर्ष करता हूं और मैन्युअल रूप से सत्र का समर्थन करता हूं: https://github.com/nodejitsu/node-http-proxy/issues/236 – tomswift

0

मुझे नोड-http-प्रॉक्सी को फोर्किंग और संशोधित करके इसे कार्यान्वित करने का एक तरीका मिला। यह मेरे वर्तमान उद्देश्य परोसता है जो एक विकास वातावरण है। किसी भी तरह के गंभीर विचार के लिए इसे एक और अधिक वैध समाधान में फहराया जाना चाहिए। https://github.com/nodejitsu/node-http-proxy/issues/236#issuecomment-5334457

मैं, इस समाधान पर कुछ इनपुट प्यार होता है, खासकर यदि मैं गलत दिशा में पूरी तरह से जा रहा हूँ:

विवरण मुद्दा मैं GitHub में दायर में पाया जा सकता।

0

हाय @tomswift http प्रोटोकॉल पर अपने स्थानीय सर्वर रन है, लेकिन सत्र कुकी के साथ दूरस्थ सर्वर कैरी से प्राप्त करता है Secure; की तरह:

'set-cookie': 
[ 'JSESSIONID=COOKIEWITHSECURE98123; Path=/;HttpOnly;Secure;'] 

यदि हां, तो अपने स्थानीय सर्वर प्रतिक्रिया से पहले क्लाइंट, मूल प्रतिक्रिया से set-cookie निकालें (रिमोट सर्वर से स्थानीय सर्वर से प्रतिक्रिया) शीर्षलेख, Secure; हटाएं और बाकी को प्रॉक्सी प्रतिक्रिया (स्थानीय सर्वर से क्लाइंट से प्रतिक्रिया) में रखें जैसे:

'set-cookie': 
[ 'JSESSIONID=COOKIEWITHSECURE98123; Path=/;HttpOnly;'] 

तो क्लाइंट सत्र कुकी स्वचालित रूप से ले जाएगा।

आशा है कि इससे मदद मिल सकती है।