Node.js中Passport会话POST请求后丢失、isAuthenticated返回false如何解决
问题修复方案
1. 调整Passport配置的加载顺序
你当前把passport.use()、serializeUser、deserializeUser逻辑写在了manage.js路由文件中,而路由挂载是在passport.initialize()执行之后,会导致Passport核心配置注册时机晚于初始化,序列化/反序列化逻辑无法正常生效。
把Passport的所有配置逻辑迁移到app.js中,放在passport.initialize()之前执行:
// app.js 中,在passport初始化前添加以下逻辑 passport.use(new LocalStrategy( { usernameField: 'email', passwordField: 'password', passReqToCallback: true }, function(req, email, passwd, done) { // 补全你的用户验证逻辑,查询数据库判断账号密码是否正确,验证通过调用done(null, user),失败调用done(null, false) }) ); passport.serializeUser(function(user, done) { done(null, user.user_id) }); passport.deserializeUser(function(id, done) { // 补全用户查询逻辑,根据序列化的id从数据库查用户对象 connection.query('SELECT * FROM users WHERE user_id = ?', [id], function (error, results) { if (error) return done(error); done(null, results[0]); }); }); // 之后再执行passport初始化 app.use(passport.initialize()); app.use(passport.session());
2. 补全deserializeUser的查询逻辑
你当前deserializeUser方法中直接返回了未定义的user变量,导致反序列化后req.user始终为undefined,isAuthenticated()自然返回false,必须补全数据库查询逻辑拿到真实的用户对象。
3. 调整express-session的配置参数
官方不建议resave和saveUninitialized都设为true,修改为以下配置避免无效会话存储:
app.use(session({ secret: "remote_teach", resave: false, saveUninitialized: false, cookie: {maxAge: 60 * 60 * 24 * 1000, httpOnly: true} }));
4. 检查POST请求的凭证携带
如果你是用AJAX发起POST请求,需要配置请求的withCredentials: true才能携带会话cookie;如果是表单提交,确认表单没有配置crossorigin等跨域属性导致cookie丢失。
额外优化
app.js中express.json()和bodyParser.json()功能重复,Express 4.16+已经内置了json解析,可删除bodyParser.json()的引用和调用,减少冗余代码。
内容的提问来源于stack exchange,提问作者pei
相关产品推荐
相关产品推荐

