golang-jwt "key is of invalid type"

结论

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

posted @ 2022-02-03 16:27  moon_orange  阅读(898)  评论(0编辑  收藏  举报