Passport的注销功能是否会删除cookie?如果没有,它是如何工作的?

时间:2015-07-26 20:58:03

标签: javascript node.js authentication passport.js passport-local

来自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如何运行 实际上是将用户注销了吗?

5 个答案:

答案 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)

据我所知,这是常见问题。您可以尝试以下方法。

  1. 尝试使用logOut()而不是logout()

    req.logOut(); req.redirect('\');

  2. 尝试使用session.destroy

    req.session.destroy(function (err) { res.redirect('/'); });

  3. 您也可以参考链接: 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没用。