登录状态校验必须依赖中间件:需在每次请求时解析并验证jwt或session,注入用户信息至c.locals,失败返回统一json响应,且中间件必须注册在所有受保护路由之前。

登录状态校验必须依赖中间件,不能只靠前端传 token
用户登录后,服务端必须在每次请求时验证身份凭证(如 JWT、session ID 或自定义 token),否则任何“已登录”判断都不可信。Fiber 本身不内置登录态管理,你需要自己实现中间件来统一拦截、解析、校验并注入用户信息到 c.Locals 中。跳过这步直接在 handler 里查数据库或解析 cookie,会导致逻辑重复、遗漏路由、无法统一错误响应。
JWT 校验中间件:解析 + 验证 + 注入用户信息
最常见做法是用 JWT,中间件需完成三件事:从 Header/Query/Cookie 提取 token、调用 jwt.Parse() 验证签名与有效期、将解析出的 user ID 或 claims 存入 c.Locals("user_id")。注意以下关键点:
- 提取位置要和客户端一致:默认从
Authorization: Bearer xxx读,若用X-Token头,得手动取c.Get("X-Token") -
jwt.Parse()必须传入正确的SigningKey和ValidateFunc,否则过期或篡改的 token 可能被误判为有效 - 验证失败时不要直接
c.Status(401).SendString("unauthorized")—— 应统一返回 JSON,比如c.JSON(fiber.Map{"code": 401, "msg": "invalid or expired token"}) - 成功后务必调用
c.Next(),否则后续路由不会执行
Session 登录态校验:依赖 store,注意 Cookie 安全配置
若用 session(如基于 Redis 的 github.com/gofiber/fiber/v3/middleware/session),校验逻辑更简单,但配置稍多:
- 初始化 session store 时,
CookieSecure在 HTTPS 环境下必须设为true,否则浏览器可能拒发 Cookie -
CookieHTTPOnly必须为true,防止 XSS 窃取 session ID - 校验中间件中用
store.Get(c)获取 session,再检查s.Get("user_id") != nil;若不存在,直接return c.Status(401).JSON(...) - 别把整个 session 对象塞进
c.Locals,只存必要字段(如user_id、role),避免序列化开销和内存泄漏
校验后如何在 Handler 中安全使用用户信息
中间件注入的 c.Locals 是临时上下文数据,只在当前请求生命周期内有效。Handler 中必须显式检查是否存在,不能假设一定有:
- 用
userID, ok := c.Locals("user_id").(int64)做类型断言 + 存在性判断,ok == false说明中间件未通过或被绕过 - 不要在 service 层直接调用
c.Locals—— handler 应提取userID后作为参数传入 service 方法,保持业务层无框架依赖 - 敏感操作(如删账号、改密码)建议二次校验:除了登录态,再比对
c.IP()或 User-Agent 是否与登录时相近,防 token 泄露后被复用
app.Use(authMiddleware),那个路由就彻底裸奔。











