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