我初始化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。愚蠢的错误,我的坏......
答案 0 :(得分:2)
默认情况下,express-sesssion
中间件将检查现有的会话cookie,如果不存在,它将在中间件运行的任何请求上创建新的cookie和新的会话对象。
要支持登录功能,您必须实际实现某种形式的身份验证,如果登录凭据本身未验证,则不必创建新的会话cookie和会话对象。或者,您可以在会话对象中添加一个标志,指示该会话的登录是否已经过验证,并检查是否存在会话以及是否已设置验证标志。
您显示的代码位看起来像每个传入的连接只会创建一个新的会话对象(如果一个已经存在)并且您的所有验证代码都在检查是否存在会话对象,它始终存在会因为一旦你摆脱它,那么下一个传入的请求将再次运行中间件并创建一个新的会话cookie和对象。