go jwt 报key is invalid or of invalid type 错误常见的两个原因

538

go项目中常用的一个jwt包:github.com/dgrijalva/j… ps:现在新版迁移到github.com/golang-jwt/…

func GenerateJwtToken(username, password string) (string, error) {
   nowTime := time.Now()
   // 过期时间
   expireTime := nowTime.Add(3 * time.Hour)
   claims := Claims{
      username,
      password,
      jwt.StandardClaims{
         ExpiresAt: expireTime.Unix(),
         // 签发者
         Issuer: "go-website-gin",
      },
   }
   // 这个地方经常会出现错误
   tokenClaims := jwt.NewWithClaims(jwt.SigningMethodES256, claims)
   return tokenClaims.SignedString(jwtSecret)
}

报错的原因有2个:

第一个常见错误:

一个是 jwtSecret,这个key的底层是一个[]byte断言 --> key.([]byte)

func (m *SigningMethodHMAC) Sign(signingString string, key interface{}) (string, error) {
    if keyBytes, ok := key.([]byte); ok {
        if !m.Hash.Available() {
            return "", ErrHashUnavailable
        }

        hasher := hmac.New(m.Hash.New, keyBytes)
        hasher.Write([]byte(signingString))

        return EncodeSegment(hasher.Sum(nil)), nil
    }

    return "", ErrInvalidKeyType
}

此处因为传入的入股不是[]byte,将会报错key is invalid or of invalid type

第二个常见错误:

jwt.NewWithClaims 他的加密方式应该选择jwt.SigningMethodHS256 而不是 jwt.SigningMethodES256 ,这个H是hash的意思,而SigningMethodES256是没有SignedString方法的