我正试图破坏客户端的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();
方法。
答案 0 :(得分: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.user
JSON中的session
包含我从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。