【问题标题】:Socket.io not sharing sessions with expressSocket.io 不与 express 共享会话
【发布时间】:2017-10-13 15:23:53
【问题描述】:

我不知道为什么会发生这种情况,因为它之前运行良好。

我正在使用以下库:

"express-socket.io-session": "^1.3.2"
"socket.io": "^2.0.3"
"express": "^4.15.4"
"express-session": "^1.15.5"

1 - 我通过 http 请求登录用户并将 cookie 发送回前端。 http 上的所有操作都可以与前端后端交换中的 cookie 完美配合。

2 - 用户登录后,我告诉前端“好的,用户已登录,现在连接到套接字”:

io ( this.url );

以下是相关代码:

var io_session = require("express-socket.io-session");
var e_session = require("express-session");

var sessionFileStore = require('session-file-store')(e_session);

var ee_session = e_session({
    store: new sessionFileStore({ path: './user_sessions' }),
    secret: "something-random",
    resave: true,
    saveUninitialized: true
});

var enableCORS = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', req.headers.origin);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Origin, Accept, Content-Type, Authorization, Content-Length, X-Requested-With, *');
    res.header('Access-Control-Allow-Credentials',true);

        // intercept OPTIONS method
    if ('OPTIONS' == req.method) {
        res.sendStatus(200);
    } else {
        next();
    };
};

app.use(function(req, res, next) {      
  ///
   next();
});

//app.use(cookieParser());
app.use(enableCORS);
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(ee_session);

preparedApp = require("http").Server(app);

var io = require("socket.io")(preparedApp);

io.use(io_session(e_session,{
    autoSave: true
}));

preparedApp.listen(8080, function(){});

io.on('connection', function(socket){

    var socket_session = socket.handshake.session,
        socket_session_id = socket.handshake.sessionID;

    console.log("SOCKET_SESSION:",socket_session);
    console.log("SOCKET_SESSION_ID:",socket_session_id);

    (...)

3 - socket_session 是“空的”,但常规 http cookie 中的所有内容都有效。会话保持在那里。

我注意到的一件事是socket_session_id 指向文件夹 user_sessions 中不存在的会话文件。唯一存在的是在​​ http 登录中创建的。所以,基本上:

=> 用户登录:efihaeif939311kf3f3 会话 id 文件已创建。

=> Socket 连接:fiaejgieofaekofek 是同一登录流程中的会话 id但文件不存在在 user_sessions 中(注意会话 id 不一样)

知道为什么会这样吗?我完全不知道。

谢谢

【问题讨论】:

  • var e_session = e_session({ ... }) 不好,我会将 var 重命名为 session 以便清楚并且您不会覆盖导入引用(它实际上可能是您问题的根源)。跨度>
  • @James 已经这样做了,但问题仍然存在。
  • @James 没有其他想法?仍然卡住:(
  • 我的意思是有明显的问题可能是我不想一直问的问题,请提供一个小而完整的代码示例,以便我可以正确诊断.
  • “不工作”的代码正好在上面......控制台日志不一样,会话ID不一样尽管用户正确登录http,是返回前端,然后前端发送socket请求...

标签: node.js sockets session cookies socket.io


【解决方案1】:

尝试通过将会话 json 字符串化并在客户端检索和解析回会话对象来共享会话。

这可能有效。

【讨论】:

  • 它很可能会工作,但它也会使应用程序容易受到身份攻击,很可能......
猜你喜欢
  • 1970-01-01
  • 2012-05-15
  • 2018-05-30
  • 2014-10-21
  • 1970-01-01
  • 2016-09-10
  • 2018-05-18
  • 2015-03-26
  • 2020-03-04
相关资源
最近更新 更多