关于 cookie,关于 Golang gin 框架。

2022-08-04 10:45:00 +08:00
 cxytz01

有服务 A 、B ,A 是账户系统,B 是业务系统。 A 的域名是:account.test.com ,B 的域名是 business.test.com

前端通过 account.test.com 登录,拿到 cookie ,后续的业务请求都走 business.test.com

下面的 gin 代码设置了 cookie ,通过打印 c.Request.Host ,发现 domain 为 account.test.com

c.SetCookie(core.SESSION, userauth.Credential, 604800, "/", c.Request.Host, false, true)

当前端请求 business.test.com 时,浏览器没有带上 cookie ,请问该怎么处理?

2285 次点击
所在节点    Go 编程语言
18 条回复
Xhofe
2022-08-04 10:56:32 +08:00
sso
CodeCodeStudy
2022-08-04 10:57:26 +08:00
单点登录问题

需求,在 a.com 上登录了,同时需要在 b.com 也登录

把登录单独做一个系统

举例:登录系统 sso.com ,网站 a.com b.com

访问 a.com 需要登录的地方时,发现没有登录,则跳转到 sso.com ,在 sso.com 登录后,在 sso.com 生成 cookie 设置在浏览器上,同时在 url 里带上 token 跳转到 a.coma.com 的客户端拿到 token 后,发送请求到服务端,a.com 服务端发送请求到 sso.com 进行验证,通过的话则在 a.com 进行登录,设置 cookie 等,只需要在 sso.com 验证一次即可

b.com 同理

这样 a.comb.com 之间就没有直接的关联
shoaly
2022-08-04 10:59:27 +08:00
更换架构, 不用 cookie, 换成 token 的 , token 天然就跨域
cxytz01
2022-08-04 11:03:17 +08:00
能否有更简单的方式处理上面的问题,现在搞 sso 来不及,工作量很大。
anviod
2022-08-04 11:05:16 +08:00
Cookie 存储 改为 *.test.com 即可匹配 百度就是这样做的
cnbattle
2022-08-04 11:08:47 +08:00
不同业务域名跳转时,uri 带用户 token ,
至少啥 token 怎么验证 验证逻辑,类似 jwt 这样的去中心的算法验证 各自验证 或 sso 验证中心,各有利弊,根据自己业务场景选就可以
FawkesV
2022-08-04 11:10:39 +08:00
前端处理,在跳转的时候 把 cookie 传过去
keepeye
2022-08-04 11:10:52 +08:00
我没记错的话,改成这样就可以了
c.SetCookie(core.SESSION, userauth.Credential, 604800, "/", "test.com", false, true)
shoaly
2022-08-04 11:31:20 +08:00
@cxytz01 cookie 改 token 只需要改动 登陆和 拿到当前用户的方法, 应该是不影响业务逻辑的
fgwmlhdkkkw
2022-08-04 11:47:44 +08:00
*.test.com
dzdh
2022-08-04 12:27:23 +08:00
kkeep
2022-08-04 12:30:41 +08:00
c.Request.Host
laolaowang
2022-08-04 14:45:10 +08:00
采用#5 方案不就 OK 了。放到根域名下
cxytz01
2022-08-04 17:35:13 +08:00
谢谢大家,研究了好久,下面是结论:
```
如果不显示设置 domain ,浏览器 /postmain(下文称之为 client)会自动限制 cookie 为请求的 domain
如果设置的 domain 不满足 c.SetCookie 函数的格式,函数会放弃设置 domain ,等同于不显示设置 domain

不满足 c.SetCookie 函数的 domain 格式: ip, X:port, *.abc.com
满足 c.SetCookie 函数的 domain 格式:localhost ,abc.com, .abc.com

在微服务系统中,服务无法拿到请求的域名,比如通过:c.Request.Host 拿取。经过实验:
1) 直连场景,c.Request.Host 可以拿到请求的 domain /r/n
2) 通过网关,网关反向代理到账户系统,仅能拿到内网 domain 。(kubernetes 容器 service name)

解决办法:将域名写入配置文件,比如 test.com ,然后设置入 cookie 。
```
cxytz01
2022-08-04 17:53:31 +08:00
补充

1. *_abc_com 是不行的,会被判定为错误的 domain 。
2. _abc_com 是正确的,但是在浏览器 /postman 层会被设置为 abc_com
```
8 楼是的答案简单的解决方案,sso 的方案目前时间不允许。

请讲上面文本里面的_替换成.,因为 V2EX 不允许我发送外链:
```
创建新回复过程中遇到一些问题:
请不要在每一个回复中都包括外链,这看起来像是在 spamming
```
cxytz01
2022-08-04 17:54:31 +08:00
@cxytz01 序号 2 修正: __(两个_)abc_com,
IDAEngine
2022-08-04 21:10:23 +08:00
直接前端把 cookie post 到新域名
yc8332
2022-08-05 11:12:55 +08:00
前端登录成功,请求下你需要设置 cookie 的域名,把 cookie 设置进去,可以弄些参数进行校验 cookie 是否安全。最简单的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/870581

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX