You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fiber v2中调用Save()后会话无法持久,受保护路由返回401未授权

Fiber v2中调用Save()后会话无法持久,受保护路由返回401未授权

我看了你的代码和问题描述,很快就发现了几个导致会话无法持久的关键问题,咱们一步步来解决:

1. CookieSecure 配置与测试环境不匹配

你在session配置里设置了CookieSecure: true,这个属性的作用是只有在HTTPS连接下,浏览器或curl才会保存并发送这个Cookie。但你现在用http://localhost测试,属于HTTP连接,登录时服务器设置的Cookie根本不会被curl保存,后续请求自然带不上Cookie,session也就为空了。

解决方法:测试环境把CookieSecure改成false,生产环境部署到HTTPS时再改回true:

var (
    store *session.Store
)

func GetSession() *session.Store {
    if store == nil {
        var config = session.Config{
            KeyLookup:      "cookie:__Host-session",
            Expiration:     30 * time.Minute,
            CookieSecure:   false, // 测试环境关闭,生产环境开启HTTPS后再设为true
            CookieHTTPOnly: true,
            CookieSameSite: "Lax",
        }
        store = session.New(config)
    }

    return store
}

2. curl测试未携带Cookie

默认情况下,curl不会自动保存和携带Cookie,所以你登录请求返回的Cookie没有被保存,后续访问受保护路由时自然没有身份凭证,导致401。

解决方法:用curl的-c参数保存Cookie,-b参数携带Cookie:

# 登录并保存Cookie到本地文件
curl -c cookies.txt -X POST http://localhost:4242/login -H 'Content-Type: application/json' -d '{"username":"toto","password":"tototata"}'

# 携带Cookie访问受保护路由
curl -b cookies.txt http://localhost:4242/hostname

3. 额外检查:中间件与路由的顺序

虽然你的代码里看起来没问题,但要确保session相关的逻辑在Auth中间件之前能正常初始化。不过上面两个点应该已经能解决你的核心问题了,先试这两个修改。

按照上面的步骤调整后,你应该能看到后续请求里session的username值正常读取,不再返回401了。

备注:内容来源于stack exchange,提问作者Paul-Marie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 09:19:36