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

Posted

技术标签:

【中文标题】req.session.destroy 和护照注销不会破坏客户端的 cookie【英文标题】:req.session.destroy and passport logout aren't destroying cookie on client side 【发布时间】:2018-10-31 11:21:07 【问题描述】:

我正在尝试销毁客户端的 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();方法。

【问题讨论】:

您可以使用res.clearCookie("cookieName")删除客户端的cookie 但即使是会话也没有被破坏。就像 cookie 仍然有一个有效的会话 ID,我不明白为什么 【参考方案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")

在这里您可以看到session JSON 中的passport.user 包含我从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")

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

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 cookie。

【讨论】:

以上是关于req.session.destroy 和护照注销不会破坏客户端的 cookie的主要内容,如果未能解决你的问题,请参考以下文章

如何在用户从帐户注销时断开事件触发(node.js + express socket.io)

session和cookie的前后的操作

在 laravel 护照中注销用户

如何在 ExpressJS 中结束会话

带有本地护照注销的节点js不起作用

Expressjs护照本地无法注销