You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:37:22