Golang Go语言中关于cookie和gin框架的问题

发布于 1周前 作者 sinazl 来自 Go语言

有服务 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 ,请问该怎么处理?


Golang Go语言中关于cookie和gin框架的问题

更多关于Golang Go语言中关于cookie和gin框架的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

19 回复

sso

更多关于Golang Go语言中关于cookie和gin框架的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


单点登录问题

需求,在 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 之间就没有直接的关联

更换架构, 不用 cookie, 换成 token 的 , token 天然就跨域

能否有更简单的方式处理上面的问题,现在搞 sso 来不及,工作量很大。

Cookie 存储 改为 *.test.com 即可匹配 百度就是这样做的

不同业务域名跳转时,uri 带用户 token ,
至少啥 token 怎么验证 验证逻辑,类似 jwt 这样的去中心的算法验证 各自验证 或 sso 验证中心,各有利弊,根据自己业务场景选就可以

前端处理,在跳转的时候 把 cookie 传过去

我没记错的话,改成这样就可以了
c.SetCookie(core.SESSION, userauth.Credential, 604800, “/”, “test.com”, false, true)

cookie 改 token 只需要改动 登陆和 拿到当前用户的方法, 应该是不影响业务逻辑的

采用#5 方案不就 OK 了。放到根域名下

谢谢大家,研究了好久,下面是结论:
<br> 如果不显示设置 domain ,浏览器 /postmain(下文称之为 client)会自动限制 cookie 为请求的 domain<br> 如果设置的 domain 不满足 c.SetCookie 函数的格式,函数会放弃设置 domain ,等同于不显示设置 domain<br> <br> 不满足 c.SetCookie 函数的 domain 格式: ip, X:port, *.abc.com<br> 满足 c.SetCookie 函数的 domain 格式:localhost ,<a target="_blank" href="http://abc.com" rel="nofollow noopener">abc.com</a>, .abc.com<br><br> 在微服务系统中,服务无法拿到请求的域名,比如通过:c.Request.Host 拿取。经过实验:<br> 1) 直连场景,c.Request.Host 可以拿到请求的 domain /r/n<br> 2) 通过网关,网关反向代理到账户系统,仅能拿到内网 domain 。(kubernetes 容器 service name)<br><br> 解决办法:将域名写入配置文件,比如 <a target="_blank" href="http://test.com" rel="nofollow noopener">test.com</a> ,然后设置入 cookie 。<br>

补充

1. *_abc_com 是不行的,会被判定为错误的 domain 。
2. _abc_com 是正确的,但是在浏览器 /postman 层会被设置为 abc_com
<br>8 楼是的答案简单的解决方案,sso 的方案目前时间不允许。<br><br>请讲上面文本里面的_替换成.,因为 V2EX 不允许我发送外链:<br>
创建新回复过程中遇到一些问题:
请不要在每一个回复中都包括外链,这看起来像是在 spamming
```

序号 2 修正: _(两个)abc_com,

直接前端把 cookie post 到新域名

前端登录成功,请求下你需要设置 cookie 的域名,把 cookie 设置进去,可以弄些参数进行校验 cookie 是否安全。最简单的

关于Golang Go语言中的cookie和gin框架的问题,以下是我的专业回复:

在Go语言中,cookie是一种存储在客户端浏览器中的键值对数据,用于在客户端和服务器之间传递信息。每次向服务器发送请求时,浏览器都会自动携带这些cookie信息。

Gin是一个基于Go语言的Web框架,旨在简化Web应用的开发。在Gin框架中,可以通过c.SetCookie方法设置cookie,其中cgin.Context对象的实例。该方法接受多个参数,包括cookie的名称、值、过期时间、路径、域名、是否安全以及是否仅通过HTTP传输等。

使用Gin框架设置cookie时,需要注意以下几点:

  1. 确保cookie的名称和值都是有效的字符串。
  2. 根据需要设置cookie的过期时间。如果不希望cookie过期,可以将其设置为一个较大的值或者nil(但请注意,某些浏览器可能仍然会限制cookie的存活时间)。
  3. 设置cookie的路径和域名,以确保cookie能够在正确的范围内被访问。
  4. 如果需要,可以设置cookie为安全或仅通过HTTP传输,以增强安全性。

总之,Gin框架提供了简洁高效的API来管理cookie,使得在Go语言中开发Web应用变得更加容易和快捷。

回到顶部