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

KAT*_*KAT 2 cookies node.js express passport.js express-session

我正在尝试销毁客户端的 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'});
        });

    });

});
Run Code Online (Sandbox Code Playgroud)

我也试过这个req.logOut();方法。

ves*_*sse 7

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")
}
Run Code Online (Sandbox Code Playgroud)

在这里您可以看到,passport.usersessionJSON 中保存了我从serializeUser(用户名)返回的值。调用req.logout会话存储后仍然保留会话但缺少序列化的用户信息,即。我不再登录了:

> 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")
}
Run Code Online (Sandbox Code Playgroud)

如果我将注销路由处理程序更改为:

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

我可以看到注销后,上面的会话已经消失,但创建了一个新会话,因为我登陆了首页并开始了一个新会话:

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

此外,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');
  });
});
Run Code Online (Sandbox Code Playgroud)

单击注销按钮后会话存储为空(请注意,示例中不会执行进一步的请求):

> db.sessions.find().pretty();
> 
Run Code Online (Sandbox Code Playgroud)

并且注销请求的响应头显示一个清除的 cookie:

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

现在,如果没有对服务器执行进一步的请求(即使未登录,新的请求也可能会启动一个新会话),您不应再connect.sid在浏览开发人员工具中看到cookie。