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)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM