2012-04-28 13 views
14

से एक्सप्रेस सत्र आईडी प्राप्त नहीं कर सकता है मेरे पास नोड में एक सामान्य वेब एप्लिकेशन है जो एक्सप्रेस फ्रेमवर्क और सत्र मिडलवेयर का उपयोग कर रहा है। मैं अपने आवेदन के कुछ गतिशील हिस्सों के लिए सॉकेट.ओ का भी उपयोग कर रहा हूं (वर्तमान में, यह एक चैट तंत्र है, लेकिन यह टेंगेंशियल है)। मैं सफलतापूर्वक सत्र और सॉकेट.ओओ को अपने आप स्थापित करने में सक्षम हूं, लेकिन उन्हें गठबंधन करना चाहता हूं (ईजी: डेटाबेस को मारने के बिना उपयोगकर्ता खातों के साथ सॉकेट चैट संदेशों को जोड़ने के लिए)।कुकीज़ w/Socket.IO

यह ध्यान दिया जाना चाहिए (और मैं इसे एक संभावित मुद्दा बिंदु देख सकता हूं), मैं विभिन्न बंदरगाहों पर दो एक्सप्रेस सर्वर चला रहा हूं: एक नियमित HTTP यातायात के लिए, और एक HTTPS यातायात के लिए। हालांकि, मैं दोनों सर्वरों को एक समान विन्यास से गुजर रहा हूं और एक ही सत्र स्टोर साझा करता हूं। सत्र http और https पृष्ठों के बीच मेरे लिए बने रहते हैं। सत्र प्रारंभ में एचटीटीपीएस से पेश किए गए एक पृष्ठ के माध्यम से सेट किया जा रहा है और socket.io पेज वेनिला HTTP है।

मैं सॉकेट.io और सत्रों को एकीकृत करने के बारे में जो कुछ ढूंढ रहा हूं उसे प्राप्त करने के लिए here पर स्थित मार्गदर्शिका का पालन कर रहा हूं। हालांकि, प्रमाणीकरण समारोह के भीतर, data.headers.cookie कभी भी सेट नहीं किया गया है, मेरे आवेदन के सत्र-आधारित भाग अपेक्षित के रूप में काम कर रहे हैं। और अधिक अजीब बात यह है कि सत्र स्थापित करने के बाद, यदि मैं ब्राउज़र में से console.log(document.cookie) करता हूं, तो मुझे एक खाली स्ट्रिंग मिलती है, लेकिन जब मैं फ़ायरफ़ॉक्स डेवलपर टूलबार के साथ अपनी कुकीज़ देखता हूं, तो एक्सप्रेस और कनेक्ट दोनों के लिए एक एसआईडी कुकी होती है। यहाँ

var config = { 
    ip   : "127.0.0.1", 
    httpPort : 2031, 
    httpsPort : 2032 
}; 

var utils  = require("./utils"), 
    express  = require('express'), 
    fs   = require('fs'), 
    parseCookie = require('./node_modules/express/node_modules/connect').utils.parseCookie, 
    routes  = require('./routes')(config); 

var httpsOpts = { 
    key : fs.readFileSync("cert/server-key.pem").toString(), 
    cert: fs.readFileSync("cert/server-cert.pem").toString() 
}; 

var app    = express.createServer(), 
    https   = express.createServer(httpsOpts), 
    io    = require("socket.io").listen(app, { log: false}), 
    helpers   = require("./helpers.js"), 
    session   = new express.session.MemoryStore(), 
    sessionConfig = express.session({ 
     store : session, 
     secret : 'secret', 
     key  : 'express.sid', 
     cookie : {maxAge : 60 * 60 * 1000} 
    }); //share this across http and https 

configServer(app); 
configServer(https); 

//get SID for using sessions with sockets 
io.set('authorization', function(data, accept){ 
    if(data.headers.cookie){ 
     data.cookie = parseCookie(data.headers.cookie); 
     data.sessionID = data.cookie['express.sid']; 
    } else { 
     return accept("No cookie transmitted", false); 
    } 

    accept(null, true); 
}); 

io.sockets.on('connection', function(socket){ 
    //pull out session information in here 
}); 

function configServer(server) { 
    server.configure(function(){ 
     server.dynamicHelpers(helpers.dynamicHelpers); 
     server.helpers(helpers.staticHelpers); 
     server.set('view options', { layout: false }); 
     server.set('view engine', 'mustache'); 
     server.set('views', __dirname + '/views'); 
     server.register(".mustache", require('stache')); 
     server.use(express.static(__dirname + '/public')); 
     server.use(express.bodyParser()); 
     server.use(express.cookieParser()); 
     server.use(sessionConfig); 
    }); 
} 

और ग्राहक पर प्रासंगिक कोड है::

यहाँ सर्वर कोड के संबंधित भाग है

<script src="/socket.io/socket.io.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function(){ 
     var socket = io.connect('http://127.0.0.1'); //make sure this isn't localhost! 
     socket.on('server', function(data){ 
      //socket logic is here 
     }); 
    } 
</script> 

अद्यतन

यहां तक ​​कि एक कुकी मैन्युअल सेट करने के बाद सॉकेटियो का उपयोग कर रहे पृष्ठ के मार्ग में (और केवल सत्र चर नहीं), अनुरोध का कुकीज़ हिस्सा अभी भी है अनुपस्थित।

उत्तर

11

मैंने क्लाइंट साइड पर प्रारंभिकरण को देखने के लिए कभी नहीं सोचा होगा। मैंने लोकलहोस्ट से स्पष्ट आईपी (127.0.0.1) में पता बदल दिया और अब कुकीज़ को सॉकेट.आईओ में हेडर के साथ भेजा जा रहा है। मुझे यकीन नहीं है कि यह स्पष्ट है या नहीं, जैसा कि मैंने माना है कि लोकहोस्ट को 127.0.0.1 पर मैप किया जा रहा था।

+8

बिल्कुल! यही कारण है कि मैं ग्राहक कोड चाहता था। आप मेजबान देने के बिना 'var socket = io.connect();' का भी उपयोग कर सकते हैं। कार्य करना चाहिए। – freakish

+0

मेरे लिए बिल्कुल वही समस्या है, और यह पूरी तरह से काम किया। – bento

संबंधित मुद्दे