React中req.session为空对象,Postman可正常使用的问题求助
会话认证异常问题
问题现象
采用会话认证(单用户网站),后端基于Node.js使用cookie-session和cors包实现。Postman/Insomnia中登录→访问受保护路由→登出流程完全正常,但React前端调用API时,后端req.session为空对象,受保护路由返回401,已尝试修改Cookie设置但无效,卡了10小时。
后端配置
使用的包:cookie-session、cors
const sessionConfig = { secret: tokenSecret, cookie: { maxAge: 1000 * 60 * 60 * 1, }, resave: true, saveUninitialized: true, }; app.use(session(sessionConfig)); app.use(morgan('dev')); console.log(NODE_ENV === 'production' ? PRO_URL : LOCAL_URL); const corsOptions = { credentials: true, origin: NODE_ENV === 'production' ? PRO_URL : LOCAL_URL, }; app.use(cors(corsOptions)); app.use(routes);
前端Axios配置
const API_BASE_URL = 'myURL'; const api = axios.create({ baseURL: API_BASE_URL, withCredentials: true, }); await api.post('protected route') // 此请求返回401
登录处理逻辑
async function login(req, res, next) { try { if (req.session.isAuth) throw new ApiError('该账户已登录', StatusCodes.BAD_REQUEST); const { password } = req.body; console.log(password); if (password?.toString() !== WEBSITE_PASSWORD) throw new ApiError('密码不正确', StatusCodes.UNAUTHORIZED); req.session.isAuth = true; return responser(res, StatusCodes.ACCEPTED); } catch (error) { return next(error); } }
排查解决建议
- 调整Cookie的SameSite与Secure属性:默认
cookie-session的SameSite为lax,跨域场景下浏览器可能拦截Cookie。修改session配置:const sessionConfig = { secret: tokenSecret, cookie: { maxAge: 1000 * 60 * 60 * 1, sameSite: process.env.NODE_ENV === 'production' ? 'none' : 'lax', secure: process.env.NODE_ENV === 'production', }, resave: true, saveUninitialized: true, }; - 校验CORS origin与前端地址完全匹配:确保后端
LOCAL_URL/PRO_URL和前端API_BASE_URL完全一致,包括协议、域名、端口,不能有多余斜杠或拼写错误。 - 检查请求Cookie携带情况:在Chrome开发者工具Network面板,查看登录请求响应头的
Set-Cookie,再确认后续受保护路由请求的请求头是否包含Cookie字段,判断是否是浏览器拦截了Cookie发送。 - 本地开发临时禁用SameSite限制:在Chrome地址栏输入
chrome://flags/#same-site-by-default-cookies,将该选项设为Disabled,重启浏览器后测试,验证是否为SameSite规则导致的问题。 - 升级
cookie-session版本:旧版本可能存在跨域Cookie的兼容性bug,尝试升级到最新稳定版。
内容的提问来源于stack exchange,提问作者Saybers
相关产品推荐
相关产品推荐

