使用golang-jwt(v5)验证JWT时遇签名无效错误:密钥类型非法
解决golang-jwt(v5)中"token signature is invalid: key is of invalid type"错误
问题根源在GetToken函数的jwt.Parse回调逻辑里:你错误地返回了token对象作为签名验证密钥,而不是生成Token时使用的HMAC密钥,导致签名校验时密钥类型不匹配,触发错误。
修复步骤
生成Token时用[]byte(secretKey)完成签名,验证阶段必须使用完全相同的密钥来校验签名。修改GetToken函数如下:
func GetToken(c *gin.Context) (*jwt.Token, error) { tokenString := getTokenFromRequest(c) 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"]) } // 返回与生成Token时一致的HMAC验证密钥 return []byte(secretKey), nil }) return token, err }
额外优化(可选)
ValidateToken函数可以补充对Claims的断言校验,同时确保token.Valid的判断逻辑更严谨:
func ValidateToken(c *gin.Context) error { token, err := GetToken(c) if err != nil { return err } claims, ok := token.Claims.(jwt.MapClaims) // 同时校验Claims类型和Token有效性 if !ok || !token.Valid { return errors.New("invalid token provided") } // 按需添加自定义Claims校验逻辑(比如验证authorized字段) if !claims["authorized"].(bool) { return errors.New("token unauthorized") } return nil }
内容的提问来源于stack exchange,提问作者Avag Sargsyan
相关产品推荐
相关产品推荐

