node.js - 尽管用户在网站上注销,但 Socket.io 授权仍然存在

标签 node.js session express socket.io passport.js

我正在使用express-socket.io-session在我的应用程序上。我已经集成它并且可以正常工作。但只有一种情况。

看看下面的代码:

io.use(...);
io.sockets.on("connection", function (socket) {

    socket.onVerify = (msg, fn) => {
        socket.on(msg, (data) => {

            console.log(socket.handshake.session.passport);

            if (typeof socket.handshake.session.passport === "undefined") {
                socket.emit("auth failed emit", {
                    msg: "Please login via the website"
                });
                return false;
            }

            fn(data, socket.handshake.session);
        });
    }

    socket.onVerify("chat message", function (req, session) {
        Chat.publish(session.email, req.msg);
    });
});

基本上,在每个套接字请求中,我都会验证已定义的 socket.handshake.session.passport,这意味着用户已登录。

它在这种情况下有效:

  • 我打开浏览器选项卡,使用我的凭据登录,重定向到/game 端点,我的游戏在该端点加载并连接到 socket.io
  • 我点击“注销”按钮,重定向到/game 端点,游戏告诉我“我需要授权。”

但是,在这种情况下它不起作用:

  • 我打开浏览器选项卡,使用我的凭据登录,重定向到/game 端点,我的游戏在该端点加载并连接到 socket.io
  • 我在新选项卡上点击“注销”按钮,然后在该选项卡中注销。
  • 我切换回主选项卡,游戏仍然在线。

我在代码中添加了调试 (console.log(socket.handshake.session.passport)),尽管我已注销,但它仍显示 { user: 1 }已经所以它必须是未定义

由于某种原因,socket.io 握手/ session 无法识别它,因此我可能需要在某些情况下刷新它。

有没有办法用socket.io做到这一点?

最佳答案

这只是尝试解决您的问题,我不确定它是否有效。但你可以尝试这样的事情:

app.get("/logout", function(req,res){
  //do other logging out stuff
  sockets.disconnectUser(req.session.user_id);
}

// Disconnect User function
sockets.disconnectUser = function(user_id){
  sockets.socket(users[user_id]).disconnect();
}

如此处所述:Destroying a handshake after logout. socket.io

关于node.js - 尽管用户在网站上注销,但 Socket.io 授权仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39164152/

相关文章:

node.js - 无法使用 Cli 安装 Angular2 应用程序

node.js - 没有 'new' 就不能调用类构造函数

asp.net - 在页面之间存储 ID 最多一天?

javascript - 如何在使用 app.use(express.static ('public' )); 时测试 Express 应用程序

node.js - 处理Node.js中的错误

node.js - 如何使用 Express JS/RailwayS (Node.JS) 生成 JSON

javascript - 回调函数以某种方式返回未定义

node.js - 通过多个页面将变量保存在socket.io中

php - 重定向后 session 丢失

express - 如何优雅地处理 express 中的 promise rejection