JWT过期必须依赖payload中标准exp字段(int64秒级Unix时间戳),由token.Claims.Valid()显式触发校验;推荐用jwt.RegisteredClaims并配置WithClockSkew容错。JWT过期时间必须写在 exp 字段里,不能靠外部缓存或服务端计时Go 的 jwt-go(v3 及以前)或 golang-jwt(v4+)都只认标准 Claims 中的 exp 字段来校验过期。你手动记个时间戳、或者用 Redis 存个"预计过期时间",JWT 库本身不会读它------校验时只看 token payload 里的 exp 值。常见错误是:生成 token 时没设 exp,以为后续用 time.Now().Add(24 * time.Hour) 就够了;或者写了但用了错的字段名,比如 expires_at 或 timeout,结果 token 永远不报过期。exp 必须是 int64 类型的 Unix 时间戳(秒级),不是 time.Time,也不是毫秒用 time.Now().Add(...).Unix(),别用 .UnixMilli()如果用 golang-jwt v4+,推荐直接用 jwt.RegisteredClaims,它内置了 ExpiresAt 字段,类型是 *jwt.NumericDate,需要 wrap 一下:jwt.NewNumericDate(time.Now().Add(24 * time.Hour))用 jwt.RegisteredClaims 而不是 mapstringinterface{} 构建 Claims 更安全手写 map 构造 Claims 看似灵活,但容易漏字段类型、拼错 key、忘记 exp,而且无法静态检查。尤其 exp、iat、nbf 这些字段,map 里写成字符串或 float64 都会导致解析失败或静默忽略。示例对比:立即学习"go语言免费学习笔记(深入)";// ? 危险:字段名小写、exp 是 float64、没 iatclaims := mapstringinterface{}{ "exp": time.Now().Add(24 * time.Hour).Unix(), "user_id": 123,}<p>// ? 推荐:类型明确、字段标准、自动处理 exp/iad/nbfclaims := jwt.RegisteredClaims{ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)),IssuedAt: jwt.NewNumericDate(time.Now()),Subject: "user:123",}校验时必须调用 token.Claims.Valid(),否则 exp 不生效很多人解析 token 后只取 token.Claims 里的字段就完事,比如直接读 claims"user_id"。但这时 exp 校验根本没触发------Valid() 才是真正执行时间字段比对的入口。 WisPaper 复旦大学研发的AI学术搜索工具,5分钟内筛选1000篇论文
相关推荐
AIgorithmGEEK4 小时前
MySQL 索引全解(下):建、查、删实战与知识速查表Smoothcloud润云6 小时前
PyTorch大模型权重加载与启动耗时优化实战:定位磁盘、内存与显存瓶颈databook6 小时前
从循环到向量化:NumPy提速的7个关键思维唠点键盘之外的6 小时前
26 向量数据库实战:从 0 搭一条能用的检索链路(pgvector + Spring AI)云和恩墨7 小时前
数据库监控简史:监控不止于告警——从图表大爆发到健康管理闭环ly76897 小时前
MongoDB 事务开销实测:快照隔离下的写冲突、重试与分片事务边界棉猴7 小时前
玩游戏学Python1-Python和pgzero库的安装豆角焖肉7 小时前
Spring AOP 自定义注解实现系统操作日志诺伦7 小时前
GEO优化数据实证:78%引用流向官网的机制拆解与小品牌三步管线实战教程 | RiseClaw玄策oooost7 小时前
pytorch学习笔记1