跨域部署场景下express-session无法向前端返回session cookie问题求助
修复步骤
1. 配置Express信任Heroku反向代理
在app.js模块导入之后添加如下代码:app.set('trust proxy', 1);
Heroku采用反向代理转发请求到Node服务,Express默认不信任代理传递的HTTPS标识,会判定当前请求为HTTP协议,导致标记了secure: true的cookie被拒绝下发。
2. 配置Cookie的domain属性适配子域名共享
修改session配置中的cookie字段,添加domain配置实现多子域名共享cookie:
cookie: { sameSite: "none", secure: true, httpOnly: true, maxAge: 8600000, domain: ".yourdomain.com" // 替换为你自己的主域名,前缀带点可适配所有子域名与主域名 }
3. 删除重复的CORS配置
你同时使用了cors中间件和自定义CORS头中间件,重复设置响应头会导致浏览器报跨域头冲突错误,直接删除手写的那段res.header设置CORS的中间件即可,cors包已经处理了所有跨域逻辑。
4. 修复登录接口会话保存异步逻辑
session.save为异步操作,当前代码在保存完成前就返回了响应,可能导致会话还未写入存储就返回,cookie不会被携带在响应中。修改admin_routing.js中的登录逻辑:
if(same) { req.session.adminID = admin._id; req.session.save((err) => { if(err) console.log(err); res.send({error: "Sucess!"}); // 放到save回调中再返回响应 }); }
5. 清理前端请求无效配置
前端axios请求里的Access-Control-Allow-Origin是服务端响应头,前端请求添加该字段属于无效配置,直接删除即可;同时原catch块中直接调用res.data会抛出未定义错误,同步修正:
await axios.post("https://my-app.herokuapp.com/admin/login", {username: Inputs[0].value, password: Inputs[1].value}, {withCredentials: true}) .then((res) => { document.getElementById("err-bc").innerText = ""+res.data.error; document.getElementById("err-bc").style.visibility = "visible"; console.log(res.data); }).catch((err) => { document.getElementById("err-bc").innerText = "请求失败,请重试"; document.getElementById("err-bc").style.visibility = "visible"; });
注意:Cloudflare默认配置不要修改Cookie相关的过滤规则,避免会话Cookie被Cloudflare拦截。
内容的提问来源于stack exchange,提问作者astroxii
相关产品推荐
相关产品推荐

