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

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

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

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

    其实这些都差不多的,甚至你直接要求 codex 给你写一个也很难出错的。
    MIUIOS
        9
    MIUIOS  
       19 小时 22 分钟前
    已经好久没用过 cookie 了
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   700 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 19:39 · PVG 03:39 · LAX 12:39 · JFK 15:39
    ♥ Do have faith in what you're doing.