JWT认证在Echo中需手动实现登录签发、中间件配置和路由注册全流程。必须自写/login接口签发token,正确配置jwtmiddleware的SigningKey与ErrorHandler,按顺序注册中间件,并确保前端用Bearer scheme传token。

JWT 登录认证在 Echo 中不能只靠 jwtmiddleware 就跑起来——它默认不处理登录接口、不签发 token、也不校验用户凭据,必须手动补全整条链路。
登录接口必须自己实现签发逻辑
Echo 的 jwtmiddleware 只负责校验请求头里的 token,完全不参与登录流程。你得单独写一个 /login 路由,接收用户名密码,查库验证,再用 jwt.NewWithClaims 手动生成 token:
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"user_id": 123,
"exp": time.Now().Add(time.Hour * 24).Unix(),
})
signedToken, _ := token.SignedString([]byte("your-secret-key"))
- 别把密钥硬编码在代码里,应从环境变量读取(如
os.Getenv("JWT_SECRET")) -
exp必须是int64,传time.Time.Unix(),不是字符串或 float - 不要在响应体里返回明文密码字段,哪怕只是临时调试
jwtmiddleware 配置容易漏掉 SigningKey 和 ErrorHandler
直接用 jwtmiddleware.New 会 panic,因为 SigningKey 是必填项;同时默认错误处理会返回 401 + 空体,前端难排查:
Echo框架 5.1.0 版本源码包下载,适合关注 RealIP 行为变化、StartConfig.Listener、NewDefaultFS 和观测性中间件入口的开发团队。
authMiddleware := jwtmiddleware.New(jwtmiddleware.Config{
SigningKey: []byte("your-secret-key"),
ErrorHandler: func(c echo.Context, err error) error {
return c.JSON(http.StatusUnauthorized, map[string]string{"error": "invalid or expired token"})
},
})
-
SigningKey类型必须是[]byte,传 string 会编译失败 - 如果用 RSA,要改用
SigningMethod+ContextJWTKey并预加载公钥 - 中间件注册顺序很重要:必须放在路由定义之后、
Start之前,否则不生效
前端传 token 必须用 Bearer scheme,且 header 名固定
jwtmiddleware 默认只从 Authorization: Bearer 提取,不支持 X-Auth-Token 或 query 参数(除非自定义 Extractor):
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." http://localhost:8080/api/profile
- 漏写
Bearer前缀(注意空格)会导致 401,错误信息里不会提示缺 scheme - token 过期后,中间件返回 401,但不会告诉你具体是过期还是签名错——需要自己在
ErrorHandler里判断err.(*jwt.ValidationError)的Errors字段 - 浏览器跨域时,确保后端已配
CORS并允许Authorizationheader
真正卡住人的地方往往不是 JWT 本身,而是 token 生成和校验两端的 claims 结构不一致、时间戳时区偏差、或者中间件没挂到目标路由组——建议先用 curl 绕过前端,确认 /login 返回 token、/api/xxx 在带 Bearer 时能进 handler 再往下调。










