Express+Passport登录req.isAuthenticated()返回false
问题根因
你遇到的req.isAuthenticated()始终返回false的核心原因是缺少Passport对接session的必填中间件,另外存在一处代码顺序不规范、一处粘贴引入的无效代码问题。
具体修复点
- 补全缺失的
passport.session()中间件
你在初始化Passport时只写了app.use(passport.initialize()),漏了passport.session()。这个中间件是Passport基于express-session持久化登录态的核心:它会在每个请求进来时,从session中取出之前序列化存储的用户ID,调用你定义的deserializeUser方法查询对应用户,挂载到req.user上,只有这个流程跑通,req.isAuthenticated()才会返回true。
补全位置必须在session中间件、passport.initialize()之后:app.use( session({ secret: process.env.SESSION_SECRET, resave: false, saveUninitialized: false }) ); app.use(passport.initialize()); app.use(passport.session()); // 新增这一行 - 调整用户数组的声明顺序
你当前代码先调用initializePassport传入查询用户的回调,之后才声明const users = []。虽然因为JS闭包的延迟查找特性,请求进来时users已经完成初始化不会直接报错,但不符合代码逻辑顺序,容易触发暂时性死区问题,需要把const users = []移到initializePassport调用之前:// 先声明内存用户数组 const users = []; initializePassport( passport, (email) => users.find((user) => user.email === email), (id) => users.find((user) => user.id === id) ); - 清理passport-config.js里的无效粘贴字符
你贴的passport-config代码里,initialize函数闭合括号后混进了enter code here的无效字符串,直接删掉即可,否则会触发语法错误。
修复验证
改完之后重启服务,注册账号再登录,校验通过后passport.authenticate会把用户ID存入session,后续访问根路径时passport.session()会自动恢复登录态,req.isAuthenticated()就会正常返回true,不会再被重定向到登录页。
内容的提问来源于stack exchange,提问作者Saleh Khatri
相关产品推荐
相关产品推荐

