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