【发布时间】:2018-10-10 13:10:39
【问题描述】:
我初始化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('/');
}
});
}
};
我的测试:
我向位于requiresLogin 中间件后面的test 端点提交了一个请求,我得到了(如预期的那样):
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。愚蠢的错误,我的错......
【问题讨论】: