结论
在使用golang-jwt库来生成token时,常用如下代码:
func GenAccessToken(userid int64) (aToken string, err error) {
// 创建一个自定义的声明
c := MyClaims{
userid,
jwt.StandardClaims{
ExpiresAt: time.Now().Add(accessTokenExpireDuration).Unix(), // 过期时间
Issuer: "forest", // 签发人
},
}
// 加密并获取完整编码后的字符串token
aToken, err = jwt.NewWithClaims(jwt.SigningMethodHS256, c).SignedString(mySecret)
return
}
问题发生在SignedString()
上,该api必须传入[]byte类型的数据。
原因
进入SignedString()
的源码,可以看出SignedString使用SigningMethodHS256方式,结合一个随机值(mySecret)进行加密,进入t.Method.Sign(sstr, key)
中查看,找到SigningMethodHS256所属的SigningMethodHMAC类型函数:
// Implements the Sign method from SigningMethod for this signing method.
// Key must be []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
}
注释中明确说明key必须是[]byte类型。代码中也是只针对[]byte类型进行处理:key.([]byte)
。