Iris官方不提供iris.JWT,需手动集成github.com/golang-jwt/jwt/v5编写中间件,完成Authorization头提取、token校验(签名/过期/算法)及用户信息注入ctx.Values(),错误时调用ctx.StopWithStatus(401),成功后放行ctx.Next()。

别用 iris.JWT —— Iris 官方不提供这个东西,所谓 “iris.JWT” 是旧文档残留或社区误传。你得自己集成 github.com/golang-jwt/jwt/v5,手写中间件,否则 token 解析了但不校验、过期了也不拦截,等于裸奔。
怎么写一个真正生效的 JWT 验证中间件
关键不是“解析 token”,而是三步闭环:提取 → 校验 → 注入。漏掉任一环都会导致 401 不触发、用户信息拿不到或 panic。
- 用
strings.HasPrefix(ctx.GetHeader("Authorization"), "Bearer ")判断头是否存在且格式正确,空值或错前缀必须立刻ctx.StopWithStatus(iris.StatusUnauthorized) - 提取后调用
jwt.ParseWithClaims(tokenStr, &MyClaims{}, keyFunc),其中keyFunc必须返回非 nil 的密钥([]byte或*rsa.PublicKey),返回nil会导致签名校验跳过 - 必须同时检查
err != nil(如 base64 解码失败)和token.Valid == false(如过期、签名错),二者都走 401;特别注意*jwt.TokenExpiredError要显式识别并返回 401,不能只靠token.Valid - 校验成功后,用常量 key(如
CtxUserIDKey = "user_id")往ctx.Values().Set()写入业务字段,别用字符串字面量(如"user")——多个中间件会覆盖
为什么 jwt.New() 创建的中间件总不生效
因为 jwt.New() 默认只解析 token,不自动启用签名/过期/iss 等验证逻辑。它本质上是个“空壳”,必须显式调用 .Serve() 并传入完整验证配置,否则中间件形同虚设。
- 必须调用
j.Serve(),且该调用要在app.Use(j)之前完成,否则中间件注册的是未激活版本 -
ValidationKeyGetter返回的密钥必须与签发时完全一致:HS256 用[]byte("my-secret"),RS256 用解析好的*rsa.PublicKey,混用类型或带多余空格都会静默失败 - 若签发时用了
ExpiresAt和Issuer,验证中间件默认会校验这两项;不想校验就得显式禁用,比如加jwt.WithValidMethods([]string{})(不推荐) - 调试时加一行
app.Logger().Infof("auth header: %s", ctx.GetHeader("Authorization")),确认前端真传了Authorization: Bearer xxx,而不是Token xxx或放 body 里
如何在 MVC Controller 里安全读取用户 ID
MVC 的路由组(Party)必须先挂载中间件,再传给 mvc.New(),否则中间件根本进不了请求链——控制器方法会直接执行,JWT 验证等于没做。
- 正确顺序:
api := app.Party("/api"); api.Use(authMiddleware); mvcApp := mvc.New(api)。写反了(比如先mvc.New(api)再api.Use())就无效 - 在 controller 方法里,用
ctx.Values().Get(CtxUserIDKey)获取,然后做类型断言:if userID, ok := val.(int64); ok { ... },别直接强转,避免 panic - 不要在中间件里调用
ctx.Session().Set()或写数据库日志——这破坏无状态性;ctx.Values()仅限单请求内存传递,随请求结束自动销毁 - 如果需要角色权限控制,别在每个 handler 里重复判断,把
role也塞进ctx.Values(),然后统一用另一个中间件(如roleMiddleware)校验路径+方法+角色白名单
最易被忽略的一点:时间偏差。服务器时间比客户端快几秒,exp 就可能已过期。上线前务必用 time.Now().UTC().Unix() 统一时区,并在测试环境模拟 ±30 秒偏差验证逻辑是否健壮。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











