浏览器后退按钮不会破坏Passport JS + Express JS中的会话。如何完全终止/终止会话?

时间:2015-02-05 14:39:48

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

我的退出机制的代码是

app.get('/logout', isLoggedIn, function(req, res) {
        req.logout();
        res.redirect('/');
    });

使用密钥的Express会话包,无法在任何地方设置Cookie。

在我退出后单击浏览器后退按钮时,它仍然允许用户返回正在进行身份验证的页面。如何完全终止此会话?

isLoggedIn只是通过PassportJS的isAuthenticated方法进行身份验证。这是什么方式?

请帮忙。在此先感谢。

编辑:这是会话ID

enter image description here

1 个答案:

答案 0 :(得分:7)

为已注销的用户有条件地将Cache-control标题设置为no-cache

app.use(function(req, res, next) {
    if (!req.user)
        res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
    next();
});

这将强制浏览器获取页面的新副本,即使它们点击了#34;返回"。


注意:这是以禁用未登录的 所有 用户的缓存为代价的,为了这个答案,这些用户包括那些刚刚退出。如果您不想完全禁用所有注销用户的缓存,您应该找到区分这两者的方法。会话的东西..

如果您确定当用户点击时,'/login'是他们将要登陆的路线,那么您只能在那里定义它,从而避免了上述操作的麻烦。


  

这段代码到底在哪里?

app.get('/logout', isLoggedIn, function(req, res) {
    req.logOut();
    if (!req.user) 
        res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
    res.redirect('/login');
});
     

可以像这样使用吗?

没有

app.get(或app.use)定义您的路线。文档:http://expressjs.com/api.html#request

如果客户端请求路由app.get('/logout'...

'/logout'仅执行

app.use(...)(未指定任何路线)将针对所有请求执行。

这些路线"中间件" (因为他们被称为)也相继执行。 (您将在上述文档中了解更多信息)

您希望在任何其他路由之前设置标题,以便无论其他路由呈现什么,都会使用强制使用户缓存无效的标头进行呈现。

// > HERE <
// before all the other routes

app.get('/logout'...
app.get('/login'...
app.get('/'...
app.get('/stuff'...