在fiber中注册jwt中间件需使用社区库github.com/gofiber/jwt/v3,通过jwt.new()传入signingkey等配置,支持全局app.use()或分组api.use()注册;校验失败默认返回401及标准json,可自定义errorhandler;payload存于c.locals["user"],需类型断言提取;/login路由必须绕过该中间件。

怎么在 Fiber 中注册 JWT 中间件
Fiber 本身不内置 JWT 支持,得靠 fiber-jwt 这个社区中间件(注意不是官方维护,但当前最稳定)。它本质是把 JWT 校验逻辑封装成一个 fiber.Handler,直接挂到路由或分组上即可。
安装命令是:go get github.com/gofiber/jwt/v3。注意版本号必须带 v3,v4 尚未适配 Fiber v2.50+ 的新上下文接口,用错会报 cannot use jwt.New(...) (value of type fiber.Handler) as fiber.Handler。
注册方式有两种:
- 全局保护所有路由:
app.Use(jwt.New(jwt.Config{SigningKey: []byte("your-secret-key")})) - 只保护某组路由:
api := app.Group("/api"); api.Use(jwt.New(...)); api.Get("/profile", handler)
JWT 中间件校验失败时返回什么
默认情况下,fiber-jwt 遇到无效 Token(签名错误、过期、格式不对)会直接返回 401 Unauthorized 并附带 JSON:{"message":"Invalid or expired JWT"}。这个响应体不能直接改,但可以拦截。
想自定义错误响应,必须用 ErrorHandler 回调:
jwt.New(jwt.Config{
SigningKey: []byte("secret"),
ErrorHandler: func(c *fiber.Ctx, err error) error {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"code": 401,
"message": "登录已失效,请重新登录",
})
},
})
注意:这个回调只捕获 JWT 解析/验证阶段的错误,不处理后续业务逻辑里的 panic 或手动 c.Status(403).Send()。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
怎么从 JWT 中提取用户 ID 或角色
中间件校验通过后,Token 的 Payload 会被解析并存进 c.Locals,键名固定为 "user"。你得自己类型断言取出:
func profileHandler(c *fiber.Ctx) error {
user := c.Locals("user").(*jwt.Token)
claims := user.Claims.(jwt.MapClaims)
userID := uint(claims["id"].(float64)) // 注意:JSON number 默认是 float64
role := claims["role"].(string)
// 后续查库、鉴权都基于这些值
return c.JSON(fiber.Map{"id": userID, "role": role})
}
常见坑:
-
claims["exp"]是float64类型的时间戳(毫秒),别直接当time.Time用 - 如果 Payload 里存的是整数 ID,解出来一定是
float64,必须显式转成int或uint - 没在
SigningKey里配对称密钥,却用了HS256算法,运行时报key is of invalid type
为什么 /login 路由不能被 JWT 中间件拦住
因为登录接口本身就要生成 Token,它必须绕过校验。最稳妥的做法是用 app.Post("/login", loginHandler) 单独注册,**不要把它放进任何用了 Use(jwt.New(...)) 的路由组里**。
如果非要用分组,得手动跳过:
auth := app.Group("/auth")
auth.Post("/login", loginHandler) // 不加中间件
auth.Use(jwt.New(...)) // 后续所有路由才受保护
auth.Get("/me", meHandler)
另一个容易忽略的点:前端传 Token 必须用标准格式 Authorization: Bearer xxxxx。如果写成 token: xxxxx 或漏掉 Bearer 前缀,中间件根本不会读取请求头,直接 401。










