V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
cxytz01
V2EX  ›  Go 编程语言

关于 cookie,关于 Golang gin 框架。

  •  
  •   cxytz01 · 2022-08-04 10:45:00 +08:00 · 2394 次点击
    这是一个创建于 848 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    18 条回复    2022-08-05 11:12:55 +08:00
    Xhofe
        1
    Xhofe  
       2022-08-04 10:56:32 +08:00
    sso
    CodeCodeStudy
        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.coma.com 的客户端拿到 token 后,发送请求到服务端,a.com 服务端发送请求到 sso.com 进行验证,通过的话则在 a.com 进行登录,设置 cookie 等,只需要在 sso.com 验证一次即可

    b.com 同理

    这样 a.comb.com 之间就没有直接的关联
    shoaly
        3
    shoaly  
       2022-08-04 10:59:27 +08:00
    更换架构, 不用 cookie, 换成 token 的 , token 天然就跨域
    cxytz01
        4
    cxytz01  
    OP
       2022-08-04 11:03:17 +08:00
    能否有更简单的方式处理上面的问题,现在搞 sso 来不及,工作量很大。
    anviod
        5
    anviod  
       2022-08-04 11:05:16 +08:00
    Cookie 存储 改为 *.test.com 即可匹配 百度就是这样做的
    cnbattle
        6
    cnbattle  
       2022-08-04 11:08:47 +08:00
    不同业务域名跳转时,uri 带用户 token ,
    至少啥 token 怎么验证 验证逻辑,类似 jwt 这样的去中心的算法验证 各自验证 或 sso 验证中心,各有利弊,根据自己业务场景选就可以
    FawkesV
        7
    FawkesV  
       2022-08-04 11:10:39 +08:00
    前端处理,在跳转的时候 把 cookie 传过去
    keepeye
        8
    keepeye  
       2022-08-04 11:10:52 +08:00   ❤️ 1
    我没记错的话,改成这样就可以了
    c.SetCookie(core.SESSION, userauth.Credential, 604800, "/", "test.com", false, true)
    shoaly
        9
    shoaly  
       2022-08-04 11:31:20 +08:00
    @cxytz01 cookie 改 token 只需要改动 登陆和 拿到当前用户的方法, 应该是不影响业务逻辑的
    fgwmlhdkkkw
        10
    fgwmlhdkkkw  
       2022-08-04 11:47:44 +08:00
    *.test.com
    dzdh
        11
    dzdh  
       2022-08-04 12:27:23 +08:00
    kkeep
        12
    kkeep  
       2022-08-04 12:30:41 +08:00 via Android
    c.Request.Host
    laolaowang
        13
    laolaowang  
       2022-08-04 14:45:10 +08:00
    采用#5 方案不就 OK 了。放到根域名下
    cxytz01
        14
    cxytz01  
    OP
       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
        15
    cxytz01  
    OP
       2022-08-04 17:53:31 +08:00
    补充

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

    请讲上面文本里面的_替换成.,因为 V2EX 不允许我发送外链:
    ```
    创建新回复过程中遇到一些问题:
    请不要在每一个回复中都包括外链,这看起来像是在 spamming
    ```
    cxytz01
        16
    cxytz01  
    OP
       2022-08-04 17:54:31 +08:00
    @cxytz01 序号 2 修正: __(两个_)abc_com,
    IDAEngine
        17
    IDAEngine  
       2022-08-04 21:10:23 +08:00
    直接前端把 cookie post 到新域名
    yc8332
        18
    yc8332  
       2022-08-05 11:12:55 +08:00
    前端登录成功,请求下你需要设置 cookie 的域名,把 cookie 设置进去,可以弄些参数进行校验 cookie 是否安全。最简单的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2864 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:58 · PVG 20:58 · LAX 04:58 · JFK 07:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.