Echo框架中跳过JWT中间件的常规做法是使用两个独立echo.Group:一个带JWT中间件(如/auth),一个不带(如/public),实现物理路径隔离;若共用前缀,则在Handler内按HTTP方法(如仅对非GET方法校验)或显式条件判断跳过。

只读接口跳过 JWT 中间件的常规做法
Echo 框架本身不提供“按路由跳过中间件”的内置语法,必须手动控制中间件执行链。JWT 校验通常作为全局中间件注册,所以关键不是“免除”,而是“在特定路由上不触发校验逻辑”。
常见错误是试图在 echo.Group 上用 Use() 覆盖或移除已注册的中间件——这行不通,中间件注册后无法动态卸载。
- 正确思路:把 JWT 中间件拆成“可选调用”的函数,在需要校验的 Handler 里显式调用
c.Get("user")或类似逻辑前做验证 - 更推荐:用两个独立的
echo.Group,一个带 JWT 中间件(写接口),一个不带(只读接口) - 避免把 JWT 验证逻辑写死在
echo.New().Use(...)全局链里,否则所有路由都绕不开
用无中间件 Group 实现只读路由隔离
这是最清晰、无副作用的方式。只读接口和受保护接口物理分离,不共享中间件栈。
// 创建主 Echo 实例
e := echo.New()
// 受保护的路由组(带 JWT)
auth := e.Group("/api")
auth.Use(middleware.JWT([]byte("your-secret")))
// 只读路由组(不带任何认证中间件)
public := e.Group("/v1")
public.GET("/health", healthHandler)
public.GET("/products", listProductsHandler)
public.GET("/categories", listCategoriesHandler)
// 受保护的写操作
auth.POST("/products", createProductHandler)
auth.PUT("/products/:id", updateProductHandler)
注意:/v1 和 /api 是两个完全独立的路径前缀,不会互相干扰。只要确保只读接口不被误配到 auth 组下,就天然跳过 JWT 校验。
Echo框架 5.1.0 版本源码包下载,适合关注 RealIP 行为变化、StartConfig.Listener、NewDefaultFS 和观测性中间件入口的开发团队。
如果必须共用同一路径前缀怎么办
比如要求 /api/products 既支持未登录 GET,又要求登录 POST —— 这时不能靠 Group 分离,得在单个 Handler 内部判断方法和权限。
- 不要在 Handler 开头直接调用
middleware.JWT,它会强制校验并中断请求 - 改用自定义中间件,在
GET请求时return nil提前退出,其他方法才调用jwt.ExtractToken等逻辑 - 或者更简单:在 Handler 内用
c.Request().Method == "GET"分支,只对非 GET 方法调用jwt.ParseToken(c) - 注意:JWT 解析失败时别返回 401,否则 GET 接口也会被拦住;应只对需要用户身份的操作做校验
容易忽略的兼容性细节
JWT 中间件默认对所有 HTTP 方法生效,包括 OPTIONS 预检请求。如果前端跨域调用只读接口,而你的中间件没放过 OPTIONS,就会导致 CORS 失败。
- 检查是否在中间件中漏掉了
if c.Request().Method == "OPTIONS" { return next(c) } - 确保只读接口返回的
Access-Control-Allow-Origin等头不受 JWT 中间件影响(它一般不改响应头,但自定义中间件可能误操作) - 如果用了
echo.WrapMiddleware(jwt.Middleware)包装第三方 JWT 中间件,要确认它是否支持跳过逻辑;很多封装版不暴露底层控制权
真正麻烦的从来不是“怎么跳过”,而是跳过之后,相关日志、监控、OpenAPI 文档标注是否同步更新——这些地方容易残留“该接口需鉴权”的错误假设。

















