React.js集成Passport认证:客户端无法获取req.user求助
Passport.js认证后无法获取req.user的问题
我用配置了Passport.js的API做用户认证,发起请求后会重定向到成功路由,但拿不到req.user。用Postman测试一切正常,不知道哪里漏了,求帮忙。
成功路由代码
app.get("/success", async (req, res) => { if (req.user){ return res.status(200).json({ user: req.user, message: "Logged" }); } else { return res.status(401).json({ message: "User authentication failed" }); } });
React前端请求代码
const handleSubmit = (e) => { e.preventDefault(); fetch("http://127.0.0.1:3001/login", { method:"POST", headers: { "Content-Type": "application/json", "Accept": "application/json", }, redirect: "follow", body: JSON.stringify({email: email, password: password}) }).then(resp => { return resp.json(); }).then(data => console.log(data)) }
问题原因及解决办法
核心原因
Postman会自动处理会话Cookie,但浏览器的fetch默认不会在跨域请求中携带Cookie。Passport.js依赖会话Cookie(比如connect.sid)识别已认证用户,导致重定向到/success时后端拿不到用户会话,所以req.user为空。
解决步骤
修改前端fetch配置
在fetch选项中添加credentials: "include",确保跨域请求时携带Cookie:fetch("http://127.0.0.1:3001/login", { method:"POST", headers: { "Content-Type": "application/json", "Accept": "application/json", }, redirect: "follow", credentials: "include", // 新增该行 body: JSON.stringify({email: email, password: password}) })配置后端CORS允许凭证
后端必须明确允许跨域携带凭证,且不能用*作为允许的源,要指定具体的前端域名:
以cors中间件为例:const cors = require('cors'); app.use(cors({ origin: "http://localhost:3000", // 你的React项目地址 credentials: true // 允许携带凭证 }));检查会话Cookie配置
确保express-session的Cookie属性配置正确,避免浏览器阻止Cookie:app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: false, cookie: { sameSite: "lax", // 生产环境HTTPS可改为"none" secure: process.env.NODE_ENV === "production" // 生产环境开启HTTPS } }));
内容的提问来源于stack exchange,提问作者ssam
相关产品推荐
相关产品推荐

