有服务 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 ,请问该怎么处理?
1
Xhofe 2022-08-04 10:56:32 +08:00
sso
|
2
CodeCodeStudy 2022-08-04 10:57:26 +08:00 4
单点登录问题
需求,在 a.com 上登录了,同时需要在 b.com 也登录 把登录单独做一个系统 举例:登录系统 sso.com ,网站 a.com b.com 访问 a.com 需要登录的地方时,发现没有登录,则跳转到 sso.com ,在 sso.com 登录后,在 sso.com 生成 cookie 设置在浏览器上,同时在 url 里带上 token 跳转到 a.com ,a.com 的客户端拿到 token 后,发送请求到服务端,a.com 服务端发送请求到 sso.com 进行验证,通过的话则在 a.com 进行登录,设置 cookie 等,只需要在 sso.com 验证一次即可 b.com 同理 这样 a.com 和 b.com 之间就没有直接的关联 |
3
shoaly 2022-08-04 10:59:27 +08:00
更换架构, 不用 cookie, 换成 token 的 , token 天然就跨域
|
4
cxytz01 OP 能否有更简单的方式处理上面的问题,现在搞 sso 来不及,工作量很大。
|
5
anviod 2022-08-04 11:05:16 +08:00
Cookie 存储 改为 *.test.com 即可匹配 百度就是这样做的
|
6
cnbattle 2022-08-04 11:08:47 +08:00
不同业务域名跳转时,uri 带用户 token ,
至少啥 token 怎么验证 验证逻辑,类似 jwt 这样的去中心的算法验证 各自验证 或 sso 验证中心,各有利弊,根据自己业务场景选就可以 |
7
FawkesV 2022-08-04 11:10:39 +08:00
前端处理,在跳转的时候 把 cookie 传过去
|
8
keepeye 2022-08-04 11:10:52 +08:00 1
我没记错的话,改成这样就可以了
c.SetCookie(core.SESSION, userauth.Credential, 604800, "/", "test.com", false, true) |
10
fgwmlhdkkkw 2022-08-04 11:47:44 +08:00
*.test.com
|
11
dzdh 2022-08-04 12:27:23 +08:00
|
12
kkeep 2022-08-04 12:30:41 +08:00 via Android
c.Request.Host
|
13
laolaowang 2022-08-04 14:45:10 +08:00
采用#5 方案不就 OK 了。放到根域名下
|
14
cxytz01 OP 谢谢大家,研究了好久,下面是结论:
``` 如果不显示设置 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 。 ``` |
15
cxytz01 OP 补充
1. *_abc_com 是不行的,会被判定为错误的 domain 。 2. _abc_com 是正确的,但是在浏览器 /postman 层会被设置为 abc_com ``` 8 楼是的答案简单的解决方案,sso 的方案目前时间不允许。 请讲上面文本里面的_替换成.,因为 V2EX 不允许我发送外链: ``` 创建新回复过程中遇到一些问题: 请不要在每一个回复中都包括外链,这看起来像是在 spamming ``` |
17
IDAEngine 2022-08-04 21:10:23 +08:00
直接前端把 cookie post 到新域名
|
18
yc8332 2022-08-05 11:12:55 +08:00
前端登录成功,请求下你需要设置 cookie 的域名,把 cookie 设置进去,可以弄些参数进行校验 cookie 是否安全。最简单的
|