gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:29:47 24 4
gpt4 key购买 nike

我正在使用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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com