应使用 net/http 中间件实现请求级身份验证:提取 Authorization 头、解析 JWT、校验签名与过期、存用户信息至 context;配合 chi 路由做路径级权限控制;防范 CSRF/CORS/敏感字段泄露;用 OpenAPI 与 validator 实现精细化输入校验和错误响应。
用 net/http 中间件做请求级身份验证
Go 没有内置的“认证框架”,但你可以用标准库的中间件模式在路由前拦截并校验请求。关键不是加功能,而是把验证逻辑从 handler 里抽出来,避免每个接口都重复写 Authorization 头解析、token 解析、过期检查。
常见错误是直接在 handler 里硬编码校验逻辑,导致无法复用、难以测试、权限逻辑散落各处。正确做法是写一个返回 http.Handler 的函数:
- 提取
Authorization头,校验格式是否为"Bearer " - 调用
jwt.Parse(用github.com/golang-jwt/jwt/v5)验证签名和exp字段 - 解析出用户 ID 或角色后,存入
context.WithValue(r.Context(), key, value) - 校验失败时直接
http.Error(w, "Unauthorized", http.StatusUnauthorized)并 return,不调用 next
这样后续 handler 只需从 r.Context().Value(...) 拿用户信息,不用关心怎么来的。
用 gorilla/mux 或 chi 实现路径级权限控制
单纯鉴权不够,你还得控制“谁能在什么路径上做什么”。net/http 路由太简陋,推荐用 chi——轻量、中间件链清晰、支持路由参数绑定。