JWT中间件配置需匹配客户端传token方式:URL参数用jwt.FromParameter("token"),Header需带空格,Cookie需自定义提取函数;ValidationKeyGetter须动态返回密钥并校验算法;j.Serve须仅挂载于受保护路由且顺序正确;业务中用jwt.Get(ctx)安全获取token。

jwt.New 配置必须匹配客户端传 token 的方式
JWT 中间件默认从 Authorization: Bearer $TOKEN 提取,但很多前端 SDK 或测试工具习惯用 URL 参数(如 /api/v1/user?token=xxx),这时不改 Extractor 就会一直 401。你得显式指定:Extractor: jwt.FromParameter("token")。如果用 header,别漏掉空格 —— "Bearer xxx" 是合法的,"Bearerxxx" 会解析失败。
常见错误现象:ctx.Values().Get("jwt") 返回 nil,但请求明明带了 token;或者日志里报 Missing auth token 却找不到原因。
- header 方式:用
jwt.FromAuthHeader(默认)或自定义函数提取Authorization值 - cookie 方式:需手动写
func(ctx iris.Context) string从ctx.Cookies().Get("jwt")取 - 多个来源共存?Iris 不支持开箱即用的 fallback,得自己封装一个组合 extractor
ValidationKeyGetter 不能硬编码密钥或返回 nil 错误
ValidationKeyGetter 是签名验证的关键回调,它决定用什么密钥解签、是否允许不同算法。最常踩的坑是直接 return []byte("My Secret"), nil —— 这在开发环境 OK,但上线后密钥必须从环境变量或配置中心读,且不能暴露在代码里。
另一个严重问题是没处理算法切换:比如前端发的是 HS512 签名,但你的 SigningMethod 设为 jwt.SigningMethodHS256,就会报 invalid signature 而不是明确提示算法不匹配。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 务必检查
token.Header["alg"]并返回对应密钥,否则多算法场景下无法兼容 - 返回
nil, errors.New("key not found")会导致中间件直接返回 401,不会进业务 handler - 密钥长度要符合算法要求:HS256 至少 32 字节,否则
SignedString会 panic
j.Serve 必须放在路由 handler 前,且不能被其他中间件拦截
j.Serve 是 JWT 中间件的主入口 handler,它负责解析、校验、注入 ctx.Values().Set("jwt", token)。如果你把它写在 app.Use(..., j.Serve) 全局链里,那所有路由(包括登录接口)都会强制鉴权 —— 登录接口自己就过不去。
正确做法是只对需要保护的路由组或单个路由挂载:v1.Get("/user", j.Serve, userHandler)。注意顺序:j.Serve 必须紧挨着 handler,中间不能插其他中间件(除非你确认它们不调用 ctx.StopExecution())。
- 常见错误:把
j.Serve放在 CORS 后面,而 CORS 中间件调用了ctx.Next()导致 JWT 校验被跳过 - 如果 handler 内部调用
ctx.JSON(401, ...)但忘了ctx.StopExecution(),后续逻辑仍会执行 —— 可能造成数据误操作 - 调试时可在
j.Serve后加个临时中间件打印ctx.Values().Get("jwt"),确认是否成功注入
Get() 和 CheckJWT() 的使用场景差异
jwt.Get(ctx) 是安全取已验证 token 的快捷方式,它内部做了类型断言和非空检查;而 jwt.CheckJWT(ctx) 只返回 bool,适合做条件跳过(比如“有 token 就记录用户 ID,没有也不报错”)。
别在 handler 里反复调 jwt.Get(ctx) —— 它只是从 ctx.Values() 取值,开销小,但语义上表示“我依赖这个 token”,而 CheckJWT 更偏向“可选增强”。更关键的是:两者都**不触发二次校验**,token 是否有效完全取决于 j.Serve 阶段的结果。
- 业务 handler 中必须用
jwt.Get(ctx)获取 token 实例,再通过token.Claims拿 payload - 不要用
ctx.Values().Get("jwt")手动断言,容易 panic;jwt.Get已处理好容错 - 如果需要区分“未认证”和“认证失败”,得在
j.Serve失败时主动设置 ctx.StatusCode,而不是依赖默认 401
ValidationKeyGetter 必须能根据 token 的 kid 字段动态返回新旧密钥,否则滚动更新密钥后,老 token 就全失效了。这一步没法靠 Iris 自动完成,得你自己实现 key cache 和刷新逻辑。


















