如何仅在经过身份validation时才给予会话? 任何其他中间件订单将无法正常工作

无论用户是否login,我都有创build会话的问题。

如果仅在用户成功login时才创build会话,我希望它。 否则,如果一个selenium机器人命中…例如,路由route('/users/:username')我的会议收集会充满会议,而不是真正的用户。 我让我的用户永远保持login状态,所以会话cookie设置为一年…如果会话不属于真实用户,则更糟糕。

只有authentication成功,我如何才能将会话返回给客户端? 我尝试了不同的路线和中间件的顺序,但是这是唯一正确工作的顺序。

 app.use(session({ secret: 'bob', saveUninitialized: true, resave: true, name: 'curves', cookie: { secure: false, httpOnly: false, maxAge: 365 * 24 * 60 * 60 * 1000 }, store: new MongoStore(storeOptions) })); app.use(passport.initialize()); app.use(passport.session()); app.use('/', auth); app.use('/api/v1', router); // isLoggedIn WOULD NOT WORK IF I PLACED THIS BEFORE PASSPORT/SESSION MIDDLEWARE router.route('/users/:username') .get(isLoggedIn, api.getUsername); auth.route('/auth/facebook') .get(passport.authenticate('facebook', { scope : 'email' })); auth.route('/auth/facebook/callback') .get(function(req, res, next) { passport.authenticate('facebook', function(err, userDoc, info) { if (err) { return next(err); } // I don't think !userDoc will ever happen because of mongo upsert if (!userDoc) { return res.redirect('/login'); } req.logIn(userDoc, function(err) { if (err) { return next(err); } return res.redirect('http://localhost:9000/users'); }); })(req, res, next); }); function isLoggedIn(req, res, next) { if (req.isAuthenticated()) { return next(); } res.status(404).json({ error: "not logged in" }); } 

想通了…我只需要设置saveUninitialized: false

saveUninitialized强制将“未初始化”的会话保存到商店。 会话在新build但未修改时未初始化。 selectfalse对于实现login会话,降低服务器存储使用率或在设置cookie之前遵守需要许可的法律很有用。 select错误也有助于客户在没有会话的情况下进行多个并行请求的竞争条件。

默认值为true,但使用默认值已被弃用,因为默认值将在以后更改。 请研究这个设置,并select适合您的用例。

注意,如果您将Session与PassportJS结合使用,则Passport将在会话中添加一个空的Passport对象,以便在用户通过身份validation后使用,这将作为对会话的修改来处理,从而将其保存起来。