Fiber中接入JWT鉴权中间件可实现统一、无状态的身份校验,避免手动解析token和重复验证;需定义含SecretKey、ContextKey、TokenLookup及Skipper的配置结构体,实现提取、解析、存入Locals三步验证逻辑,并支持全局、分组或单路由注册。

在Fiber框架中接入JWT鉴权中间件,是为了让API接口具备统一、无状态的身份校验能力,避免每个路由手动解析token、验证签名和过期时间,防止未授权访问绕过安全检查。
初始化JWT配置结构体
创建 middleware/jwt/config.go 文件,定义中间件所需参数。必须提供 【SecretKey】,否则启动时会 panic;ContextKey 建议显式指定为 "user",避免与其它中间件冲突;TokenLookup 默认从 Authorization 头提取,格式为 "header:Authorization",若需从 query 或 cookie 读取,此处需修改。
跳过鉴权的路径用 Skipper 函数控制,例如健康检查接口可直接放行:Skipper: func(c *fiber.Ctx) bool { return c.Path() == "/health" }。
实现JWT验证逻辑
新建 middleware/jwt/jwt.go,导入 github.com/gofiber/fiber/v2 和标准库 time。
核心逻辑分三步:① 调用 c.Get(TokenLookup) 提取原始 token 字符串;② 使用 jwt.ParseWithClaims 解析并校验签名、exp、iat 等字段,密钥必须与签发时完全一致;③ 校验通过后,将 claims 中的用户信息(如 uid、role)存入 c.Locals(ContextKey),供后续 handler 使用。
注意:若 TokenLookup 配置为 "header:Authorization",则必须确保前端传的是 Bearer xxx 格式,且中间有空格;少空格或写成 Basic xxx 会导致解析失败返回 401。
注册中间件到路由组
方法一:全局注册(推荐用于全部 API)
在 main.go 的 fiber.New() 后,直接调用 app.Use(jwt.New())。
方法二:按路由组注册(更灵活)
定义受保护的路由前缀,例如 api := app.Group("/api") → api.Use(jwt.New()) → api.Get("/user", handler)。
方法三:单个路由启用
app.Get("/admin", jwt.New(), adminHandler) —— 这种写法适合仅个别接口需要鉴权,但无法复用 Skipper 配置,慎用。
测试鉴权是否生效
启动服务后,用 curl 发起不带 token 的请求:
curl -i http://localhost:3000/api/user
应返回 401 Unauthorized 及 JSON 错误提示,而非直接进入业务逻辑。
再携带合法 token 测试:
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." http://localhost:3000/api/user
此时 handler 中可通过 c.Locals("user").(*jwt.CustomClaims) 安全获取用户声明数据,无需重复解析。


















