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
在
session
json保存我返回的值
serializeUser
(用户名)。打电话后
要求注销
会话存储区仍保留会话,但缺少序列化用户信息,即,我不再登录:
> 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
现在,如果没有对服务器执行进一步的请求(新的请求可能会启动新的会话,即使没有登录),您不应该看到
连接.sid
浏览开发者工具中的cookie。