必须使用echo-jwt/v4,正确命令为go get github.com/labstack/echo-jwt/v4且import需带/v4;Echo v5已移除内置JWT中间件,旧版或不带/v4的导入将导致编译错误或panic。

JWT中间件必须用 echo-jwt/v4,不能用旧版或内置包
Echo v5 已物理删除 echo/middleware.JWT,直接 import 或 go get 不带 /v4 后缀会拉错版本,编译报 cannot find package 或找不到 echojwt.WithConfig。正确操作只有两个:
go get github.com/labstack/echo-jwt/v4-
import "github.com/labstack/echo-jwt/v4"(少一个/v4就失败)
别试图复用 v3 的写法,也别从 github.com/dgrijalva/jwt-go 切换——它有已知 KeyFunc 旁路漏洞,且不兼容 Go 1.21+。
路由分组是唯一安全的配置方式
/login 这类颁发 token 的接口绝不能被 JWT 中间件包裹,否则请求进不来,永远卡在 401。全局 e.Use(jwtMiddleware) 是最常见错误。
- 用
e.Group("")显式划分受保护路由:auth := e.Group("/api") - 只对
auth调用auth.Use(jwtMiddleware) -
/login、/public、/healthz等必须放在 group 外,或单独定义无中间件的路由
中间件顺序不可颠倒:JWT 必须在 RBAC、日志、限流等之前注册,否则后续中间件读不到 c.Get("user")。
TokenLookup 配置错等于没开认证
默认只从 header:Authorization 提取 token,前端若传 token=xxx 在 query 里,或存到 cookie 名为 jwt,中间件根本不会触发解析,直接放行或返回 400(因缺 Authorization 头)。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 前端用 URL 参数:
TokenLookup: "query:token" - 前端用 Cookie:
TokenLookup: "cookie:jwt" - AuthScheme 不是
Bearer?比如用Token,就得同步改AuthScheme: "Token"
不支持原生多源提取(如 header + cookie 同时查),要实现得自己写 wrapper 中间件合并逻辑。
ErrorHandler 不接管就分不清 400 和 401
默认行为下:Authorization 头缺失 → 400;token 格式错误(少一段、含空格)→ 400;仅签名错或过期 → 401。前端统一处理异常时极易混乱。
- 强制所有鉴权失败走 401:
ErrorHandler: func(c echo.Context, err error) error { return c.JSON(401, map[string]string{"error": "unauthorized"}) } - 想区分过期和无效,得在 ErrorHandler 里做类型判断:
errors.Is(err, jwt.ErrTokenExpired)或strings.Contains(err.Error(), "invalid signature")
别忽略 ErrorHandler 配置——这是调试阶段最容易漏掉、上线后最难排查的一环。










