首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用https中的socket.io授权更新和查找会话,快捷3

使用https中的socket.io授权更新和查找会话,快捷3
EN

Stack Overflow用户
提问于 2014-10-17 00:39:17
回答 1查看 117关注 0票数 0

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

我进行了研究并尝试了许多解决方案,包括redis、mongoStore和session.socket.io,但我似乎总是没有连接到套接字,我很确定它与https相关。

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

提前谢谢你!

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-22 21:39:12

好吧,我找到了解决问题的办法。我仍然不知道为什么套接字握手在https中不能正常工作。我决定使用ude 连接-猫鼬与MongoDb.,它在https中工作得很好,可以根据需要在req函数调用之外使用。

我也可以在我的socket.on中使用它,所以它排除了我的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26416148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档