Passport非/login路由req.user为undefined、deserialize运行仍异常问题
问题结论
该问题与react-router无关,属于跨域请求未携带身份凭证导致的会话丢失问题。
原因说明
Passport的登录鉴权依赖session会话机制:用户登录成功后,服务端会生成唯一的sessionID,通过Cookie返回给前端;后续所有请求需要携带该Cookie,服务端才能匹配到对应的登录会话,通过deserializeUser方法得到req.user。
你仅在登录请求的axios配置中添加了withCredentials: true允许跨域携带Cookie,/tasks接口的请求未添加该配置,导致请求没有携带登录凭证,服务端无法识别用户身份,因此req.user返回undefined。
修复方法
单个请求配置修改
直接调整Tasks.js中的axios请求,添加withCredentials: true参数:
useEffect(() => { axios( { method: "GET", url: "http://localhost:4000/tasks", withCredentials: true } ).then(res => { console.log(res) }) }, [])
全局统一配置(推荐)
在前端项目的入口文件(如index.js)中添加axios全局配置,所有请求会自动携带跨域凭证,无需重复配置:
import axios from 'axios' axios.defaults.withCredentials = true
可选优化
建议调整服务端的session配置,避免浏览器拦截Cookie、会话冗余存储的问题:
app.use( session({ secret: "secretcode", resave: false, // 会话未修改时无需重存,减少性能开销 saveUninitialized: false, // 未登录的空会话不存储 cookie: { maxAge: 24 * 60 * 60 * 1000, // 会话有效期1天,可自行调整 sameSite: 'lax', secure: process.env.NODE_ENV === 'production' // 仅生产环境开启HTTPS专属Cookie } }) )
内容的提问来源于stack exchange,提问作者Assassin
相关产品推荐
相关产品推荐

