您的位置:首页 >Golang如何解析JWT_token包使用教程
发布于2026-02-09 阅读(0)
扫一扫,手机访问
用github.com/golang-jwt/jwt/v5验签需调用Parse并传入匹配算法的KeyFunc,显式检查token.Valid;生成时用jwt.RegisteredClaims设exp等标准字段,避免手写map或时间单位错误。

github.com/golang-jwt/jwt/v5 验签并解析 JWT新版 jwt 包(v5)已从 github.com/dgrijalva/jwt-go 迁移,旧包有严重安全漏洞且不再维护。直接用 v5 是当前唯一稳妥选择。
验签和解析必须同步完成:仅调用 Parse 不会验证签名,必须传入 KeyFunc 并确保返回的 key 与算法匹配,否则 Valid 字段为 false。
Parse 返回的 *Token 需显式检查 token.Valid,不能只看是否 panic 或 error 为 nilKeyFunc 应返回 []byte;若用 RS256,则返回 *rsa.PublicKey[]byte("mykey"),导致签名始终不匹配token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
}
return []byte("your-secret-key"), nil
})
if err == nil && token.Valid {
claims := token.Claims.(jwt.MapClaims)
userID := claims["user_id"].(float64) // 注意:数值型 claim 默认是 float64
}生成 JWT 时,别手写 map[string]interface{} 填 claims——容易漏掉 exp、拼错 iat,或误用时间戳单位。
jwt.RegisteredClaims 构建标准头,它自动处理 exp、iat、nbf 的 Unix 时间秒级整数格式exp 必须是 time.Time,不是秒数;设为 time.Now().Add(24 * time.Hour),不是 time.Now().Unix() + 86400map[string]interface{} 外层结构体中,避免和标准字段命名冲突(如不要叫 iss 或 sub)claims := jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)),
IssuedAt: jwt.NewNumericDate(time.Now()),
Subject: "user:123",
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, err := token.SignedString([]byte("your-secret-key"))Parse 成功但 token.Valid == false这是最常被忽略的“假成功”场景:函数没 panic、error 为 nil,但 token 实际未通过校验。
exp/nbf 时间已过期/未生效token.Claims 在 Valid == false 时仍可强制类型断言,但数据不可信——尤其 exp 过期后,MapClaims 里的 exp 值仍是原始数字,不代表当前有效token.UnverifiedClaims()(v5.1+)看原始 payload,再比对 token.Claims 是否被篡改或解析异常用 RSA 验签时,公钥必须从 PEM 块中正确解码,不能直接读文件内容后强转 *rsa.PublicKey。
io.ReadFile 读取公钥文件(如 public.pem),再用 pem.Decode 提取 blockx509.ParsePKIXPublicKey 解析,而非 ParsePKCS1PublicKey —— 后者只支持 PKCS#1 格式,而大多数 JWT 公钥是 PKIX/PKCS#8crypto/rsa: verification error,大概率是公钥格式或解析方式不对,不是私钥签名问题pubKeyData, _ := os.ReadFile("public.pem")
block, _ := pem.Decode(pubKeyData)
pubKeyInterface, _ := x509.ParsePKIXPublicKey(block.Bytes)
return pubKeyInterface.(*rsa.PublicKey), nilJWT 的核心陷阱不在语法,而在时间语义、密钥类型匹配和验证路径的完整性。哪怕只漏掉一次 token.Valid 检查,或把 exp 设成毫秒时间戳,都会让整个鉴权逻辑形同虚设。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9