echo-jwt中间件不生效主因是注册顺序错误、authorization头缺失或格式不符、keyfunc返回nil未拦截;需确保e.use()在路由前调用、header为bearer格式、keyfunc返回有效密钥并检查c.get("user")。

echo-jwt 中间件不生效,基本是注册顺序、请求头缺失、解析失败未拦截这三类问题中的一个,不是框架 bug,而是配置或调用链断在了某个环节。
Echo框架 5.1.0 版本源码包下载,适合关注 RealIP 行为变化、StartConfig.Listener、NewDefaultFS 和观测性中间件入口的开发团队。
中间件没注册到正确位置
e.Use() 必须在路由注册前调用,且顺序决定执行时机。如果把 echojwt.New() 放在 e.GET() 之后,它根本不会被挂载;如果放在日志或恢复中间件之后,但 JWT 解析出错又没显式处理,请求可能直接 panic 或静默跳过。
- 确保
e.Use(echojwt.New(config))出现在所有e.GET()/e.POST()调用之前 - 不要把它塞进某个路由组里却忘了全局注册(比如只在
adminGroup.Use()里加,但 API 接口走的是根路由) - 若同时用了自定义黑名单中间件,必须放在
echojwt.New()之后,否则查不到已解析的 token
Authorization 头没传或格式不对
echo-jwt/v4 默认只从 Authorization 请求头提取 Bearer token,格式必须是 Bearer xxx(注意空格),不支持自动 fallback 到 query 或 cookie。
- 前端发请求时确认 header 是
Authorization: Bearer eyJhbGci...,不是token=xxx或xxx纯字符串 - 如果要用 cookie,得手动改
echojwt.Config.TokenLookup,例如设为"cookie:token",并确保客户端设置了HttpOnly=false(否则 JS 拿不到,Fetch 也带不上) - 使用 Postman 或 curl 测试时,别漏掉
-H "Authorization: Bearer ..."
KeyFunc 返回 nil 或 panic 导致静默失败
echojwt 的 Config.KeyFunc 是必填项,一旦返回 nil 或抛 panic,整个验证流程就中断,但默认不报错——请求会直接透传给 handler,看起来就像“没生效”。
-
KeyFunc内必须做算法校验:拒绝alg="none",否则可被绕过 - 密钥不能硬编码为
nil或空字符串,应明确返回[]byte("your-secret") - 错误示例:
return nil, nil→ 中间件跳过验证;正确写法是return []byte("..."), nil或返回具体 error
JWT 验证本身不抛 HTTP 错误,它只把结果塞进 context;真正让“不生效”变成“401”的,是你有没有在后续逻辑里检查 c.Get("user") 是否为 nil。很多问题其实不是中间件没跑,而是 handler 里没做兜底判断,还照常执行了业务逻辑。










