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方法的