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

时间:2016-08-26 10:29:30

标签: 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已被定义,这意味着用户已登录。

在这种情况下适用:

  • 我打开浏览器标签,使用我的凭据登录,重定向到我的游戏加载的/游戏终端并连接到socket.io
  • 我点击"退出"按钮,被重定向到/游戏端点,游戏告诉我"我需要授权。"

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

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

我在我的代码(console.log(socket.handshake.session.passport))中添加了一个调试,它显示{ user: 1 }虽然我已经注销,但它必须是undefined

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

用socket.io有什么办法吗?

1 个答案:

答案 0 :(得分:0)

这只是尝试解决您的问题,我不确定它会起作用。但你可以试试这样的事情:

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