req.session.destroy和护照注销不会破坏在客户端的cookie(req.sessio

2019-10-28 11:16发布

我试图破坏在客户端的Cookie,但似乎无法弄清楚如何。 我已经试过一些方法是护照和SO提供了一些答案,但我在一个不知如何清除实际的cookie。

到目前为止我的代码是:

app.get('/logout', function (req, res){
    sessionStore.destroy(req.sessionID, (err) =>{
        if(err)console.log(err);
        req.logout();
        req.session.destroy(function (err) {
            if(err) console.log(err);
            res.status(200).json({message : 'User Logged Out'});
        });

    });

});

我也曾尝试req.logOut(); 方法。

Answer 1:

req.logout不清除会话,但相反,它会清除会话的登录信息。 从登录后,我的会话存储的例子:

> db.sessions.find().pretty();
{
  "_id" : "LkuoFL_cwkvNO3foD_k0zQYADevcdwW6",
  "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"passport\":{\"user\":\"test\"}}",
  "expires" : ISODate("2018-06-05T17:31:54.631Z")
}

在这里,您可以看到passport.usersession JSON持有我从返回的值serializeUser (用户名)。 打完电话后req.logout会话存储仍占据session,但连载的用户信息丢失,即。 我没有登录了:

> db.sessions.find().pretty();
{
  "_id" : "LkuoFL_cwkvNO3foD_k0zQYADevcdwW6",
  "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"passport\":{}}",
  "expires" : ISODate("2018-06-05T17:32:02.391Z")
}

如果我改变我的注销路由处理这样的:

app.post('/logout', (req, res) => {
  req.logout();
  req.session.destroy((err) => res.redirect('/'));
});

我可以看到,注销后的会议上面已经消失了,但一个新的形成是因为我降落在头版并开始一个新的会话:

> db.sessions.find().pretty();
{
  "_id" : "KIX2rypzvpRdqW7VlzO8B8W-FMXwffGT",
  "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"}}",
  "expires" : ISODate("2018-06-05T17:38:01.136Z")
}

另外, connect.sid在浏览器cookie现在拥有新的会话密钥。

现在添加clearCookie 。 有了这样一个注销处理程序:

app.post('/logout', (req, res) => {
  req.logout();
  req.session.destroy((err) => {
    res.clearCookie('connect.sid');
    // Don't redirect, just print text
    res.send('Logged out');
  });
});

会话存储是点击退出按钮(注意,没有进一步的请求在示例中执行)后空:

> db.sessions.find().pretty();
> 

和注销请求的响应头显示清除cookie的:

Set-Cookie: connect.sid=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT

现在,如果没有进一步的请求进行到服务器(新的可能启动,即使没有登录一个新的会话),你不应该看到connect.sid在浏览开发者工具饼干了。



文章来源: req.session.destroy and passport logout aren't destroying cookie on client side