快递会话不能破坏会话

时间:2018-04-30 12:26:21

标签: node.js express

我初始化express-session

const session = require('express-session')
const MongoStore = require('connect-mongo')(session);
//use sessions for tracking logins
app.use(session({
  secret: 'secret',
  resave: true,
  saveUninitialized: false,
  store: new MongoStore({
    mongooseConnection: mongoose.connection
  })
}));

用于检查身份验证的中间件:

function requiresLogin(req, res, next) {
  if (req.session && req.session.userId) {
        console.log('Session OK ' + JSON.stringify(req.session) );
    return next();
  } else {
    var err = new Error('You must be logged in to view this page.');
    err.status = 401;
    return next(err);
  }
}

我的logout终点:

// GET /logout
exports.logout = function(req, res, next) {
  if (req.session) {
    // delete session object
    req.session.destroy(function(err) {
      if(err) {
        return next(err);
      } else {
                req.session = null;
                console.log("logout successful");
        return res.redirect('/');
      }
    });
  }
};

我的测试:

我向test中间件后面的requiresLogin端点提交请求,我得到了(正如预期的那样):

Error: You must be logged in to view this page.

我向login端点提交请求,我收到了一个cookie:

set-cookie: connect.sid=s%3A0doMoVwGPkcVUgar3uP5WR36b7k9_v27.O2B8vl35TQLiet3WltP2UAH3iuaeif3%2BPDActkTBYUw; Path=/; HttpOnly

我在test端点上再次使用此Cookie:

Session OK {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"userId":"5ae6ddee1239c157ec36c06c"}

我执行/logout,我得到了

logout successful

之后我再次使用我认为刚刚销毁的cookie尝试我的test端点:

Session OK {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"userId":"5ae6ddee1239c157ec36c06c"}

成功destroy后,会话在数据库中不受影响。

为什么我在销毁会话后可以使用会话身份验证cookie?

修改

应删除问题。我在执行/logout时使用了错误的Cookie。愚蠢的错误,我的坏......

1 个答案:

答案 0 :(得分:2)

默认情况下,express-sesssion中间件将检查现有的会话cookie,如果不存在,它将在中间件运行的任何请求上创建新的cookie和新的会话对象。

要支持登录功能,您必须实际实现某种形式的身份验证,如果登录凭据本身未验证,则不必创建新的会话cookie和会话对象。或者,您可以在会话对象中添加一个标志,指示该会话的登录是否已经过验证,并检查是否存在会话以及是否已设置验证标志。

您显示的代码位看起来像每个传入的连接只会创建一个新的会话对象(如果一个已经存在)并且您的所有验证代码都在检查是否存在会话对象,它始终存在会因为一旦你摆脱它,那么下一个传入的请求将再次运行中间件并创建一个新的会话cookie和对象。

有关示例,请参阅how to implement login auth in node.js