iris jwt认证需手动实现全流程:提取header中token、三重校验(签名/过期/结构)、失败时401+stopexecution、成功后user.set()赋值,登录接口仅签发不含敏感信息的token,密钥须环境变量读取,user.get()为nil多因中间件注册位置错误或未正确set。

Iris 没有开箱即用的 JWT 认证中间件,必须手动实现签发、解析、绑定和拦截逻辑;漏掉 ctx.StopExecution() 或没调 ctx.User.Set(),认证就形同虚设。
JWT 中间件里怎么正确校验 token 并中断非法请求
校验不是“解析完就算”,而是必须覆盖签名、过期、结构三重检查,并在任一环节失败时立即终止后续执行。
- 用
ctx.Request().Header.Get("Authorization")提取 header,再手动切出 Bearer 后的 token 字符串;别依赖自动提取,Iris 不提供内置解析器 - 调
jwt.Parse(tokenString, key, jwt.HmacSha256),它返回err != nil时说明签名错、过期或格式非法——此时必须立刻ctx.StatusCode(401)+ctx.JSON()+ctx.StopExecution() - 验证通过后,
ctx.User.Set(&user)是强制步骤;不设这个,后续 handler 调ctx.User.Get()拿到的是nil - 绝对不要在中间件末尾写
ctx.Next()包裹全部逻辑;正确结构是if err == nil { ctx.User.Set(...); ctx.Next() } else { ctx.StopExecution() }
登录接口怎么安全签发 token 并返回给前端
签发和校验是分离动作,登录 handler 只负责生成并返回 token,不参与任何路由保护逻辑。
- 密码校验通过后,构造 payload(只含
user_id、exp、iat等必要字段),避免塞入角色、权限等可变信息 - 用
jwt.NewToken(jwt.HmacSha256)创建 token 实例,再调token.Sign(key)得到字符串 - 返回方式推荐 Header:
ctx.Header("Authorization", "Bearer "+tokenString);若走响应体,务必配ctx.StatusCode(200),别依赖默认状态码 - 密钥
key必须从环境变量读取,例如os.Getenv("JWT_SECRET");硬编码在代码里等于把钥匙贴在门上
为什么 ctx.User.Get() 总是 nil?检查中间件注册位置和赋值时机
ctx.User 是空接口容器,不是自动识别登录态的魔法字段;它的值完全取决于你在哪里、什么时候、用什么类型赋的值。
- 认证中间件必须注册在业务 handler 之前,且不能被其他
ctx.StopXXX提前截断;比如日志中间件里调了ctx.StopExecution(),那认证中间件根本不会执行 - 如果用了
app.Party("/admin")分组路由,中间件要注册在分组上:admin.Use(authMiddleware),而不是app.Use(authMiddleware),否则前台页面也会被拦 -
ctx.User.Set()的参数必须是实现了iris.User接口的类型(哪怕只是个带GetID() int方法的 struct),传map[string]interface{}会导致Get()返回nil - 调试时可加一行
app.Logger().Infof("User set: %+v", ctx.User.Get()),确认是否真的赋了值
最常被忽略的一点:JWT 密钥轮换时,旧 token 不会自动失效;除非你在 jwt.Parse 时主动检查 token.Claims.(jwt.MapClaims)["jti"] 并查黑名单,否则过期策略之外的强制登出无法实现。











