跨域cookie
需求场景
最近做通过微信注册我们的平台,我们的平台是微信是微服务,微信扫码在登录A服务,
注册在平台B服务,因此需要将扫码后的微信user info 从A服务传到B服务。
目前有三个环境:
-
本地开发环境,服务A和服务B在同一ip的不同端口,即
服务A: 192.168.2.165:5010
服务B: 192.168.2.165:3002
-
k8s环境,内网,服务A和服务B没有共同的一级域名,是两个不同的ip,即
服务A: 192.168.2.192
服务B: 192.168.2.291
-
test和线上环境,外网,服务A和服务B有共同的一级域名,即
服务A: b.a.com
服务B: c.a.com
知识点
cookie 参数 (node express 中的使用)
res.cookie('key', 'value', {
maxAge: 600000,
httpOnly: true,
path: '/',
domain: 'a.com',
secure:true //设置该选项,只有https网站才可以输出该cookie
});
-
key
cookie的变量名,必选
-
value
cookie变量的值,必选
-
maxAge
cookie变量保存的时间,可选。
可以为负数,表示此cookie只是存储在浏览器内存里,只要关闭浏览器,此cookie就会消失。maxAge默认值为-1。
可以为正数,表示此cookie从创建到过期所能存在的时间,以秒为单位,此cookie会存储到客户端电脑,以cookie文件形式保存,不论关闭浏览器或关闭电脑,直到时间到才会过期。
可以为0,表示从客户端电脑或浏览器内存中删除此cookie。
-
httpOnly
如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,
窃取cookie内容,这样就增加了cookie的安全性。这时cookie只能在服务器端获取,前端无法获取。 -
path
cookie的有效范围,是在参数domain基础上的有效范围。如果path设置为”/”,那就是在整个domain都有效,
如果path设置为”/test”,那么只在domain下的/test目录及子目录才有效。 -
domain
cookie有效的域名。可选,默认值为当前。domain只能设置为当前域或其父级域名。当domain不正确时,将设置cookie失败。
当cookie设置为一级域名a.com时,其子域b.a.com,c.a.com均有效。
-
secure
值cookie是否仅通过安全的https,值为0或1,如果值为1,则cookie只能在https连接上有效,默认值为0,表示cookei在http和https连接上都有效。
cookie 跨域的解决
(1)有共同一级域名的跨域cookie
对于有共同一级域名,只需在设置cookie时将domain设置成共同的一级域名即可,path设置为根目录/。
(2)不同ip的cookie
对于不同ip的cookie在做时没有实现cookie的共享,曲线救国了一下。
在此之前因需求,服务A跳到服务B的注册路由(/weChatRegister)不允许直接访问,因此对/weChatRegister路由进行了token的加密
和解密(使用的第三方库jsonwebtoken https://github.com/auth0/node-jsonwebtoken),因此可将所需的信息通过token从服务A带到服务B。