关于 cookie,关于 Golang gin 框架。 - V2EX
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 2783 次点击
    这是一个创建于 1233 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有服务 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     Solana     2661 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 11:47 PVG 19:47 LAX 03:47 JFK 06:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86