You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express+Passport登录req.isAuthenticated()返回false

问题根因

你遇到的req.isAuthenticated()始终返回false的核心原因是缺少Passport对接session的必填中间件,另外存在一处代码顺序不规范、一处粘贴引入的无效代码问题。

具体修复点
  1. 补全缺失的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()); // 新增这一行
    
  2. 调整用户数组的声明顺序
    你当前代码先调用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)
    );
    
  3. 清理passport-config.js里的无效粘贴字符
    你贴的passport-config代码里,initialize函数闭合括号后混进了enter code here的无效字符串,直接删掉即可,否则会触发语法错误。

修复验证

改完之后重启服务,注册账号再登录,校验通过后passport.authenticate会把用户ID存入session,后续访问根路径时passport.session()会自动恢复登录态,req.isAuthenticated()就会正常返回true,不会再被重定向到登录页。

内容的提问来源于stack exchange,提问作者Saleh Khatri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:27:25