来自docs:
Passport在req上公开了一个logout()函数(也称为logOut()) 可以从任何需要终止的路由处理程序调用 登录会话。调用logout()将删除req.user属性和 清除登录会话(如果有的话)。
app.get('/logout', function(req, res){ req.logout(); res.redirect('/'); });
通过阅读本文并对自己进行测试,logout
似乎不会从客户端删除cookie。根据我的理解,当客户提出请求时,它会发送一个cookie,Passport反序列化并转换为req.user
。
假设logout
没有删除cookie并且Passport使用cookie来确定用户是否已登录,logout
如何运行
实际上是将用户注销了吗?
答案 0 :(得分:2)
这里是完整的解决方案,它将从服务器中删除整个会话并清除客户端上的cookie
module.exports.getLogout = function (req, res, next) {
req.logout();
req.session.destroy(function (err) {
if (!err) {
res.status(200).clearCookie('connect.sid', {path: '/'}).json({status: "Success"});
} else {
// handle error case...
}
});
};
答案 1 :(得分:1)
据我所知,这是常见问题。您可以尝试以下方法。
尝试使用logOut()而不是logout()
req.logOut();
req.redirect('\');
尝试使用session.destroy
req.session.destroy(function (err) {
res.redirect('/');
});
您也可以参考链接: https://github.com/jaredhanson/passport/issues/216
答案 2 :(得分:1)
大约四年后,我遇到了这个问题,幸运的是,我想我现在已经明白了。
护照的logout
函数不会为您清除会话ID cookie。但是,这实际上不是问题。我会解释原因。
登录后,这是工作方式。当您向服务器发送请求时,会话ID cookie随请求一起发送。然后服务器获取该会话ID,使用活动会话查找相应的用户,然后为您填充req.user
。
话虽如此,请想一想如果您注销后会发生什么,但不要清除该会话ID cookie。下次发送请求时,由于未清除cookie,因此cookie仍将被发送。但是那会发生什么呢?它将尝试通过活动会话查找相应的用户...但是找不到任何内容!因此,req.user
不会最终被填充。这就是为什么不删除该Cookie并不重要的原因。
答案 3 :(得分:0)
不,它没有。 passport.js中的req.logout方法是IMO,非常糟糕。它只是从req对象中删除'user'属性。它不会触及任何cookie或更新会话存储中的会话信息。
你必须手动完成其他两件事,即
//first remove the "passport" key from the session in your store
//or set it to null
//then, when you get the confirmation callback from your store...
res.clearCookie('sid', {path: '/'});
res.redirect('/');
答案 4 :(得分:0)
好吧,您不需要从客户端删除cookie,因为一旦调用req.logout()
公开的passport
函数,护照就会删除代表已认证状态的req.user
对象在服务器上。
在客户端上,cookie本身没有被销毁,但是无效。您可以在单击注销按钮之前和之后检查cookie(执行req.logout
)。您将看到cookie的字符串表示形式和大小都发生了变化。
注销后,Cookie的大小将减小为基本大小,因为针对用户设置的所有数据均已销毁。换句话说,cookie没用。