必须传入非nil keyFunc并启用WithValidMethods和时间校验,解析后立即检查token.Valid且手动断言claims类型;密钥须≥32字节、禁止硬编码,aud/iss/nbf等字段不可忽略。
jwt.Parse 安全解析并校验 Token?直接用 jwt.Parse 不安全——它默认不校验 exp、nbf、iat,也不强制验证签名算法(比如攻击者把 alg: HS256 改成 none 就能绕过)。必须显式传入 jwt.Keyfunc 并启用时间校验。
keyFunc,哪怕只返回固定密钥(开发时)或从 JWK 动态获取(生产时)jwt.Parser 初始化时设 WithValidMethods 限定允许的算法,如 []string{"HS256"}
token.Valid,且不能只靠它——要手动确认 token.Claims.(jwt.MapClaims) 类型断言成功,再读 exp 等字段jwt.ParseWithClaims 默认选项;推荐构造 jwt.Parser{ValidMethods: [...]} 实例复用中间件里不能只“解析”,得明确失败路径:401 返回、提前终止请求、不污染后续 handler 的上下文。Gin/Chi/Fiber 写法差异大,但核心逻辑一致——从 header 提取、解析、校验、注入用户信息。
Authorization header 取值时,先检查是否以 "Bearer " 开头,用 strings.TrimPrefix 安全截取,避免空 token 或格式错导致 panichttp.StatusUnauthorized,且响应体不要暴露错误细节(比如不输出 "invalid signature")jwt.Claims 或提取的 sub/user_id 存进 request.Context,用 context.WithValue + 自定义 key(别用 string 字面量)SigningMethodHMAC 不能直接当 Keyfunc 返回值?jwt.SigningMethodHMAC 是算法类型,不是密钥。常见错误是把 func(token *jwt.Token) (interface{}, error) { return jwt.SigningMethodHMAC, nil } 当作 keyFunc,结果解析永远失败。
Keyfunc 必须返回实际密钥字节([]byte)或 *rsa.PrivateKey 等,不能返回算法对象[]byte("your-secret-key");RSA/ECDSA 则需加载 PEM 文件并调用 jwt.ParseRSAPrivateKeyFromPEM 或类似函数Keyfunc 需缓存 jwks.JSONSet 并按 kid 查找 key,避免每次请求都 HTTP 请求 jwks 端点很多人只校验签名和 exp,但 aud(受众)、iss(签发者)、nbf(生效时间)同样重要,尤其在多租户或 API 网关场景。
立即学习“go语言免费学习笔记(深入)”;
aud 必须严格匹配你的服务标识(如 "api.example.com"),防止 token 被其他服务误用iss 要白名单校验,不能只检查非空——攻击者可伪造任意 issuernbf 和 iat 建议开启校验(Parser.WithValidate(true)),否则未来时间签发的 token 可能被提前使用scope 或 permissions,应在解析后立即校验是否存在且符合预期,不要留到业务 handler 里再查最麻烦的其实是时钟偏移——服务器之间时间不同步会导致 exp 校验失败。生产环境务必用 NTP 同步时间,或给 Parser 设置 WithLeeway(30 * time.Second) 容忍小偏差。