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
相关产品推荐
相关产品推荐

