使用https中的socket.io授权来更新和查找会话,express 3



我已经通过https使用express 3.1.4设置了node.js服务器。我正试图用socket.io直接更新和查找我的会话对象(使用sessionStore)。我使用了握手授权过程的扩展示例和解释。但在设置了授权流程后,socket.io会突然停止以启动连接。

我做了研究并尝试了许多解决方案,包括redis、mongoStore和session.socket.io,但我似乎总是以套接字不连接告终,我很确定这与在https中搜索有关。

有人知道为什么这个设置不起作用吗?如果我们去掉io.set,套接字会突然重新启动连接。。

提前谢谢!

var io      = require('socket.io'),
https    = require('https'),
express = require('express');
var path = require('path');  
var express = require('express');
var http = require('http');
var mongoose = require('mongoose');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var fs = require('fs');
var passphrase = "";
var options = {
      key: fs.readFileSync('var/keys/server.key'),
      cert: fs.readFileSync('var/keys/server.crt')
};

if(passphrase) {
    options.passphrase = passphrase;
}

// We define the key of the cookie containing the Express SID
 var EXPRESS_SID_KEY = 'express.sid';
// We define a secret string used to crypt the cookies sent by Express
var COOKIE_SECRET = 'some secret';
var cookieParser = express.cookieParser(COOKIE_SECRET);
// Create a new store in memory for the Express sessions
var sessionStore = new express.session.MemoryStore();
 var app = express();
 // Configure Express app with :
 // * Cookie Parser created above
 // * Configure Session Store
app.configure(function () {
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.set('view options', { layout: false });
app.use(express.logger());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(cookieParser);
app.use(express.session({
    store: sessionStore,
    cookie: { 
        httpOnly: true
    },
    key: EXPRESS_SID_KEY
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
app.use("/app", express.static(__dirname + "/app"));
});
 //passport config
 var Account = require('./models/account');
 passport.use(new LocalStrategy(Account.authenticate()));
 passport.serializeUser(Account.serializeUser());
 passport.deserializeUser(Account.deserializeUser());
 //mongoose
mongoose.connect('mongodb://localhost/passport_local_mongoose');
// Configture routes
 require('./routes')(app);
 // Create https server, register socket.io as listener
 server = https.createServer(options, app);
 app.set('port', process.env.PORT || 3000);
 console.log(("Express server listening on port " + app.get('port')));
 io = io.listen(server);
 // We configure the socket.io authorization handler (handshake)
 io.set('authorization', function (data, callback) {
  if(!data.headers.cookie) {
     return callback('No cookie transmitted.', false);
}

 cookieParser(data, {}, function(parseErr) {
 if(parseErr) { return callback('Error parsing cookies.', false); }
    // Get the SID cookie
    var sidCookie = (data.secureCookies && data.secureCookies[EXPRESS_SID_KEY]) ||
                    (data.signedCookies && data.signedCookies[EXPRESS_SID_KEY]) ||
                    (data.cookies && data.cookies[EXPRESS_SID_KEY]);
    // Then we just need to load the session from the Express Session Store
    sessionStore.load(sidCookie, function(err, session) {
        // And last, we check if the used has a valid session and if he is logged in
        if (err || !session || session.isLogged !== true) {
            callback('Not logged in.', false);
        } else {
            // You can access it later with "socket.handshake.session"
            data.session = session;
            callback(null, true);
        }
    });
 });
 });

io.on('connection', function (socket) {
console.log("socket.io started on port"+ app.get('port'));
socket.on("request",function(data){
    console.log("socket answer = "+ data);
    socket.emit("response", [ "docA" ,"docB"]);
});
socket.on("save",function(data){
    console.log("socket save = "+ data);
   memory += data + " ";
    console.log("memory = "+ memory);   
});
});

server.listen(3000);

好吧,我找到了问题的解决方案。我仍然不知道为什么套接字握手在https中不能正常工作。我决定把猫鼬和MongoDb连接起来。它在https中运行良好,并且可以根据需要在req-res函数调用之外使用。

我也可以把它和我的插座一起使用。on,所以它排除了我的问题。

最新更新