如何通过Firebase Cloud HTTP Functions跨域向前端设置Cookie?
你遇到的报错是浏览器的原生安全限制导致的,和域名是否加前缀圆点无关:浏览器要求Set-Cookie头指定的domain属性,必须和返回该响应的服务端域名存在上下级包含关系。你的云函数当前部署在cloudfunctions.net域名下,尝试为完全无关的mydomain.com设置Cookie,属于跨顶级域操作,会被浏览器直接拦截。
方案1:抽离统一认证入口到us-central1区域
仅将认证相关接口(登录、下发凭证、刷新凭证等)部署到支持绑定自定义域名的us-central1区域,给这部分云函数绑定
auth.mydomain.com这类你的自有子域名,此时认证接口域名和你要设置Cookie的主域同属一个根域,Set-Cookie操作不会被拦截。
其他区域的业务云函数无需改动,前端请求业务接口时,自动带上mydomain.com下的Cookie,或者手动把Cookie里的认证信息放到请求头中传递给后端校验即可。方案2:放弃Cookie改用Header传Token
后端认证通过后直接将JWT等格式的认证Token放在响应体返回给前端,前端将Token存在本地存储中,后续所有发往不同区域云函数的请求,都手动在
Authorization头中携带该Token,后端直接从请求头提取Token做身份校验。
该方案完全规避了跨域Cookie的限制,注意通过缩短Token有效期、搭配刷新Token机制、做好前端XSS防护,弥补没有httpOnly属性的安全短板即可。方案3:通过Firebase Hosting做反向代理
先给你的Firebase Hosting服务绑定
api.mydomain.com自定义域名,然后在firebase.json中配置重写规则,将不同路径的请求转发到对应区域的云函数,示例配置参考:{ "hosting": { "rewrites": [ { "source": "/api/eu/*", "function": "yourEuropeanFunctionName", "region": "europe-west1" }, { "source": "/api/asia/*", "function": "yourAsiaFunctionName", "region": "asia-southeast1" } ] } }此时所有前端请求的域名都是你自有域名下的
api.mydomain.com,设置domain: mydomain.com的Cookie完全符合浏览器规则,不会被拦截。
内容的提问来源于stack exchange,提问作者Md Abdul Halim Rafi

