因为fiber.Default()仅创建空路由引擎,不含鉴权逻辑,身份验证必须显式插入中间件链且顺序正确——鉴权中间件需置于业务路由前,否则请求直接进入handler;推荐用app.Use()注册全局或分组中间件统一处理Authorization头、cookie或token解析。

为什么直接用 fiber.Default() 无法做身份验证
因为 Fiber 的默认应用实例不带任何中间件,fiber.Default() 只是快捷创建一个空路由引擎,连请求解析都不包含鉴权逻辑。你要的身份验证必须显式插入中间件链,且顺序不能错——鉴权中间件必须在业务路由之前执行,否则请求早就进 handler 了。
- 常见错误:把鉴权逻辑写在
app.Get("/admin", ...)的 handler 里,导致每个路由重复写校验,且无法拦截非法请求 - 正确做法:用
app.Use()注册全局或分组中间件,统一处理 Authorization 头、cookie 或 token 解析 - 注意:Fiber 中间件函数签名是
func(c *fiber.Ctx) error,返回c.Next()表示放行,返回c.Status(401).SendString("Unauthorized")表示拒绝
如何用 fiber.JWT() 快速接入 Bearer Token 验证
Fiber 官方维护的 fiber/jwt 是最轻量的 JWT 方案,但它不自动签发 token,只负责校验。你需要自己实现登录接口生成 token,再让 fiber.JWT() 验证后续请求。
- 安装:
go get github.com/gofiber/jwt/v3 - 初始化时传入密钥和签名算法:
jwt.New(jwt.Config{SigningKey: []byte("secret")}) - 它默认从
Authorization: Bearer <token>提取 token,不支持 cookie 或 query 参数,如需改源,得自定义Extractor字段 - 校验失败时默认返回 401,但不会输出具体错误;若要调试,可启用
ContextKey并在后续 handler 中读取c.Locals("user")(即解析后的 payload)
如何手动解析 Basic Auth 而不依赖第三方中间件
当你的客户端只发 Authorization: Basic base64(user:pass),又不想引入额外包时,直接解码校验更可控,也避免 JWT 的密钥管理负担。
- 用
c.Get("Authorization")获取头,检查是否以"Basic "开头 - 调用
base64.StdEncoding.DecodeString()解码后分割:,得到用户名密码 - 注意:Basic Auth 明文传输,务必配合 HTTPS;不要在日志中打印原始密码
- 校验通过后建议调用
c.Locals("username", user),方便下游 handler 复用,而不是反复解析 - 别忘了在验证失败时调用
c.Status(401).Set("WWW-Authenticate", "Basic realm=Restricted"),否则浏览器不会弹登录框
为什么 app.Group("/api").Use(authMiddleware) 比全局 app.Use() 更安全
不是所有路由都需要鉴权。静态资源、健康检查、登录接口本身都该放行。硬套全局中间件会导致 /health 也要带 token,既不合理,也增加误配置风险。
-
app.Group()返回新路由组,其Use()只作用于该组下的子路由,比如apiGroup.Get("/users")会被拦截,但app.Get("/login")不会 - 如果多个分组需要不同鉴权策略(如 admin 和 user 权限分离),可以分别注册不同中间件,避免在单个中间件里堆 if-else 分支
- 注意:Fiber 的路由匹配是前缀式,
app.Group("/v1")下注册Get("/v1/users")实际会变成/v1/v1/users—— 正确写法是apiV1 := app.Group("/v1"); apiV1.Get("/users", ...)


















