两天了,还是没弄明白 go 的第三方会话库,求指个路 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
shendaowu
V2EX    Go 编程语言

两天了,还是没弄明白 go 的第三方会话库,求指个路

  •  
  •   shendaowu 4 天前 2081 次点击
    我的需求是使用 postgresql 和 gin ,以及 gin-contrib/sessions 实现会话。用那个 gorm 会话驱动有什么好处吗?我打算在项目中用 gorm 。没什么好处直接用 postgresql 会话驱动就行了。

    如果是直接上手试的话,我估计我应该能达到凑合能用的程度。但是我这个人死脑筋,我想至少对会话中的关键功能比较了解之后再写代码。我应该主要是卡在这上面了。我找到的大部分内容好像都给我一种没说明白的感觉,包括那些库的文档。比如 gorilla/sessions 、wader/gormstore 和 gin-contrib/sessions 。很多参数我都不知道是干什么的。比如各个库中的那个让我异常纠结的类似 func NewCookieStore(keyPairs ...[]byte) *CookieStore 中的 keyPairs 。还有会话的整个使用流程中对应使用哪些函数我也搞不明白。会话我是大体理解的,但是感觉没法对应到具体的函数上。
    第 1 条附言    4 天前
    说一下我试过的方法。我好像最开始看的是 learnku 上的付费教程,结果那个会话是只存储在 cookie 里的,据说不太好不想用。然后我又在某网站全文搜索 gorilla/sessions ,搜到几本英文书,结果全都因为各种原因不想看。比如用了大量我看不懂的技术和代码,想要看懂还需要看书中别的地方。然后我打算直接看这些库的代码,结果被 deepseek 拦住了,它说只看代码理解不了。不过我目前来看这个可能是最有希望的,如果没有人有更好的方法我就只能硬着头皮看代码了。然后我还试过看现成的使用那些库的靠谱的 github 项目。好像没搜到什么,用的是 deepseek 给的搜索方法:path:go.mod github.com/gorilla/sessions 。然后我还在谷歌上用“gin session postgresql”之类的关键词搜了一下现成的教程。没搜到什么。
    第 2 条附言    3 天前
    我真有点想自己写了。我试了一下例子,看了一下数据库里的内容,我发现 gorilla/sessions 好像没法方便地实现让用户自己退出自己的所有登录。封号的时候强制退出好像也比较难。不过我实在是信不过自己的技术,我再找找有没有现成的简单的库。
    第 3 条附言    3 天前
    我感觉 https://github.com/alexedwards/scs 好像不错。我感觉我有看懂的希望。另外这个应该可以获取到会话 ID ,可以自己维护一个用户到会话 ID 的表。然后需要的时候进行删除。
    9 条回复    2025-10-08 08:17:17 +08:00
    greensea
        1
    greensea  
       4 天前   1
    直接自己写一个,没多少行代码的
    shendaowu
        2
    shendaowu  
    OP
       4 天前
    @greensea #1 我怕写出 BUG 。我对减少 BUG 有强迫症。
    SethShi
        3
    SethShi  
       4 天前   1
    哪里不理解, gin-contrib/sessions 用起来就挺简单, 只用一个 key, 这个是加密用的
    至于 gorilla/sessions 有多个 key, 是为了轮换 key, 因为 key 可能会泄露, 就可以每段时间换一个
    如:一开始 A, 一段时间后是 A1, A (A1 用来加密, A1 用来解密, 解密失败, 用 A 再解密一次)

    所谓这些库都是用户请求之后, 本质都是生成一个唯一 id 存入到
    response.setHeader('set-cookie', 'uuid 什么的都可以, 还可以加域名')


    然后服务端下一次来的时候, 可以通过这个 uuid 去 redis/内存去获取存储的值
    Gilfoyle26
        4
    Gilfoyle26  
       3 天前   1
    @shendaowu #2 没有失败,永远不会进步
    treexie
        5
    treexie  
       3 天前   1
    1 、cookie 中保存的是 session 的 id ,例如:JSESSIOnID=xxx(随机字符串,例如 uuid)
    2 、session 是保存在数据库(常用 redis),查询的时候通过 xxx 来查询对应的 session 数据(想保存什么数据应用自己定义)
    3 、担心 xxx 被猜到,于是增加一个签名值,sha256(xxx+密钥),这样别人就算猜到 xxx 也无法伪造签名值。有些框架会使用 JSESSIOnID=xxx.signature 的形式保存,有些是分开保存,另外创建多一个 cookie 保存签名值 JSESSIONID_SIGN=signature
    4 、密钥也需要定期更换,防止密钥泄露后,别人伪造签名值,但是密钥更换后,之前的 session 都无法验证了,所以需要保存一段时间的密钥( keyPairs ),验证时用最新的密钥验证失败后,再用历史密钥验证(有些框架在此时又会重新一个新的签名,刷新 cookie 保证签名值是最新的)
    default996
        6
    default996  
       3 天前 via Android   1
    我现在一般都是把库项目的 readme 和 example 复制到一个文件中,然后让 ai 给我写一个最小 demo 并解释
    tairan2006
        7
    tairan2006  
       3 天前 via Android   1
    自己做个 token header 不就完了,还要第三方库?
    ericguo
        8
    ericguo  
       1 天前
    要不你看看 sponge ( https://go-sponge.com/zh/getting-started/overview.html ) ?

    其实这些都差不多的,甚至你直接要求 codex 给你写一个也很难出错的。
    MIUIOS
        9
    MIUIOS  
       1 天前
    已经好久没用过 cookie 了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2994 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 11:35 PVG 19:35 LAX 04:35 JFK 07:35
    Do have faith in what you're doing.
    ubao 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