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篇论文
相关推荐
鼎讯信通11 分钟前
风电光缆运维提质增效:G-4000A 光缆故障追踪仪破解风场巡检难题CryptoPP27 分钟前
快速对接东京证券交易所API数据:实战指南与代码示例三十..36 分钟前
MySQL 从入门到高可用架构实战精要探物 AI1 小时前
把 MambaOut 塞进 YOLOv11:会有什么样的反应cfm_29141 小时前
Redis五大基本数据结构底层了解如竟没有火炬1 小时前
最大矩阵——单调栈阳区欠2 小时前
【LangChain】LLM基础介绍Cosolar2 小时前
保姆级 CrewAI 教程:从零构建多智能体协作系统GDAL2 小时前
使用 uv 管理 Python 版本真实的菜2 小时前
Redis 从入门到精通(十二):典型业务场景实战 —— 排行榜、限流器、秒杀系统、Session 共享