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

Passport.js无法将用户存入会话,req.user始终为undefined

解决方案

1. 修正Passport中间件顺序

Passport初始化必须在会话中间件之前调用,否则无法正确绑定会话到用户:

// server.js中修改为
app.use(passport.initialize());
app.use(passport.session());

2. 配置CORS允许携带凭证

跨域场景下,必须开启CORS的credentials选项,同时指定前端域名:

// server.js中修改CORS配置
app.use(cors({
  origin: "http://localhost:3000", // 替换为你的React项目运行地址
  credentials: true
}));

前端配合修改:发送请求时需携带凭证,例如Axios:

axios.post('/api/users/login', loginData, { withCredentials: true })
axios.get('/api/users/checkAuth', { withCredentials: true })

3. 优化Session Cookie配置

现代浏览器对跨域Cookie有严格限制,需配置SameSite属性,生产环境开启secure:

// server.js中修改session配置
app.use(session({
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false, // 禁止创建空会话,避免无效存储
    store: sessionStore,
    cookie: {
        maxAge: 1000 * 60 * 60 * 24,
        sameSite: "none", // 跨域场景必须设置为none
        secure: process.env.NODE_ENV === "production" // 生产环境HTTPS下开启
    }
}));

4. 调整错误处理中间件位置

错误处理中间件必须放在所有路由之后,否则会提前拦截请求导致后续逻辑无法执行:

// server.js中调整顺序
app.use(cors({...}));
app.use(express.json());
// ... 会话、Passport中间件 ...
app.use("/api/users", require("./routes/userRoutes"));
// 错误处理放在最后
app.use(errorHandler);

5. 验证Passport配置引入

确保Passport配置被正确加载,可显式引入实例(可选,但更清晰):

// server.js中修改引入方式
const passport = require('./config/passport');

内容的提问来源于stack exchange,提问作者André Gomes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:45:03