卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34417本站已运行393

go-jwt 令牌验证错误 - 令牌签名无效:密钥类型无效

go-jwt 令牌验证错误 - 令牌签名无效:密钥类型无效

php小编子墨在使用go-jwt进行令牌验证时,可能会遇到错误信息:"令牌签名无效:密钥类型无效"。这个错误是由于令牌的签名与密钥类型不匹配所引起的。令牌签名是验证令牌的重要组成部分,密钥类型则指定了用于生成和验证签名的算法。要解决这个问题,我们需要确保令牌的签名算法与密钥类型一致。接下来,我们将详细介绍如何正确配置和使用go-jwt来避免这个错误。

问题内容

出现错误


token signature is invalid: key is of invalid type

尝试验证 jwt 令牌时。使用 golang-jwt (v5) 库。

以下是我生成令牌的方法:

const (
    secretkey     = "162475e134198bd451af0b88a5defe132c72cb26fd58449772883b90c498b484"
    tokenlifespan = 4
)

func generatetoken() (string, error) {
    claims := jwt.mapclaims{}
    claims["authorized"] = true
    claims["foo"] = "bar"
    claims["exp"] = time.now().add(time.hour * time.duration(tokenlifespan)).unix()
    token := jwt.newwithclaims(jwt.signingmethodhs256, claims)

    return token.signedstring([]byte(secretkey))
}

这是生成的令牌:

这是我验证令牌的方式:

func ValidateToken(c *gin.Context) error {
    token, err := GetToken(c)

    if err != nil {
        return err
    }

    _, ok := token.Claims.(jwt.MapClaims)
    if ok && token.Valid {
        return nil
    }

    return errors.New("invalid token provided")
}

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"])
        }

        return token, nil
    })
    return token, err
}

func getTokenFromRequest(c *gin.Context) string {
    bearerToken := c.Request.Header.Get("Authorization")

    splitToken := strings.Split(bearerToken, " ")
    if len(splitToken) == 2 {
        return splitToken[1]
    }
    return ""
}

有什么建议如何让它工作吗?我缺少什么?谢谢。

解决方法

keyfunc 由 parse 使用方法作为回调函数来提供验证密钥。所以它应该返回一个密钥而不是参数 token *jwt.token

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 token, nil
+   return []byte(secretKey), nil
  })
卓越飞翔博客
上一篇: Go 语言中 nil 切片、非 nil 切片、空切片
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏