【问题标题】:Node.js/Socket.io/Passport.js LOGOUT issueNode.js/Socket.io/Passport.js 注销问题
【发布时间】:2023-03-09 08:44:01
【问题描述】:

我正在使用Node.js(Express 框架)创建一个网站,并使用Passportjs 进行身份验证。我使用socket.io 在客户端和服务器之间进行通信。我的网站显示哪些用户在线。我想要的是,当客户端关闭他的选项卡或浏览器本身而不注销网站时,我希望用户在'disconnect' 事件触发时从网站注销。代码片段应类似于server 一侧。

io.sockets.on('connection', function (socket) {
socket.on('disconnect', function()  {
    console.log("|||||| DISCONNECTED ||||||");
    //LOGOUT USER CODE
});
});

我正在使用 Passportjs 的本地策略。在 CouchDB 数据库中搜索用户,如果用户名/密码组合正确则登录。

我的解决方案显然不起作用:

app.configure(function() {
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.logger());
  app.use(express.cookieParser());
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.static(__dirname + '/'));
  app.use(express.session({ secret: 'keyboard cat'}));
  // Initialize Passport!  Also use passport.session() middleware, to support
  // persistent login sessions (recommended).
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(app.router);

  //a new custom middleware to logout the user when the pathname is '/exit'      

  app.use(function(req, res, next)  {
      var pathname = url.parse(req.url).pathname;
      if(pathname == '/exit')
        req.logout();
      next();
  });
});

我使用了一个名为 xmlhttprequest 的节点模块来创建 http 请求。

var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

然后在我的套接字的断开连接事件中,我添加了以下几行。

io.sockets.on('connection', function (socket) {
socket.on('disconnect', function()  {
    console.log("|||||| DISCONNECTED ||||||");
    var xhr = new XMLHttpRequest();      
    xhr.open("GET", "http://localhost:3000/exit");
    xhr.send();
});
});

这不起作用,并且当disconnect 事件触发时用户不会注销。我可以在控制台上看到这条消息|||||| DISCONNECTED ||||||。此外,如果我在浏览器地址栏中输入http://localhost:3000/exit,然后按回车,我会在浏览器中看到此消息:Cannot GET /exit,但在按下返回并刷新页面时,用户已注销。

【问题讨论】:

  • 它没有显示什么?你所拥有的似乎应该可以工作。或者你还没有尝试在服务器上实现任何东西?
  • 我不知道断开连接事件中应该存在的代码。
  • 我编辑了这个问题。请看一看!

标签: node.js socket.io passport.js


【解决方案1】:

这段代码不好。

 app.use(function(req, res, next)  {
      var pathname = url.parse(req.url).pathname;
      if(pathname == '/exit')
        req.logout();
        //try adding this line, so that it doesn't just show the "can't retrieve"
        res.end('<html><head>logged out</head><body>logged out</body></html>');
      next();
  });

编辑:

socket.on('disconnect', function()  {
    console.log("|||||| DISCONNECTED ||||||");
    var xhr = new XMLHttpRequest();      
    //this won't work, don't do this
    xhr.open("GET", "http://localhost:3000/exit");
    xhr.send();
});

相反,这样做:

socket.on('disconnect', function()  {
    console.log("|||||| DISCONNECTED ||||||");
    user.logout();
});

我建议此时从页面进行重定向,退出,并让退出发送另一个重定向到另一个页面。我就是这样做的。

【讨论】:

  • 没有。那不是问题。问题是我不想在浏览器中输入网址或单击注销按钮将我注销。我希望它在断开事件发生时发生。在当前情况下,我无法通过发出 HTTP 请求来注销用户。只有在我的浏览器窗口中输入相同的 url 然后按回车,我才能注销。我不想那样做。
  • 顺便说一句,我试过你的方法。它给出了一个错误。错误:发送后无法设置标头。
  • 哦,好的。此外,无法设置标题可能是我放置“结束”的问题,我只是想表明你在这一点上做得很好。
  • 它给了我一个错误:::: ReferenceError: user is not defined
  • 那是伪代码......你必须自己定义注销过程。
猜你喜欢
  • 2012-10-04
  • 2019-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 2012-12-08
  • 1970-01-01
  • 2019-07-31
相关资源
最近更新 更多