首頁 > 後端開發 > Golang > 主體

go-jwt 令牌驗證錯誤 - 令牌簽章無效:金鑰類型無效

王林
發布: 2024-02-08 21:15:31
轉載
360 人瀏覽過

go-jwt 令牌验证错误 - 令牌签名无效:密钥类型无效

php小編子墨在使用go-jwt進行令牌驗證時,可能會遇到錯誤訊息:"令牌簽章無效:金鑰類型無效」。這個錯誤是由於令牌的簽章與金鑰類型不符所造成的。令牌簽章是驗證令牌的重要組成部分,金鑰類型則指定了用於產生和驗證簽章的演算法。要解決這個問題,我們需要確保令牌的簽章演算法與金鑰類型一致。接下來,我們將詳細介紹如何正確配置和使用go-jwt來避免這個錯誤。

問題內容

出現錯誤

token signature is invalid: key is of invalid type
登入後複製

嘗試驗證 jwt 令牌時。使用 golang-jwt (v5) 函式庫。

以下是我產生令牌的方法:

const (
    secretkey     = "162475e134198bd451af0b88a5defe132c72cb26fd58449772883b90c498b484"
    tokenlifespan = 4
)

func generatetoken() (string, error) {
    claims := jwt.mapclaims{}
    claims["authorized"] = true
    claims["foo"] = "bar"
    claims["exp"] = time.now().add(time.hour * time.duration(tokenlifespan)).unix()
    token := jwt.newwithclaims(jwt.signingmethodhs256, claims)

    return token.signedstring([]byte(secretkey))
}
登入後複製

這是產生的令牌:

這是我驗證令牌的方式:

func ValidateToken(c *gin.Context) error {
    token, err := GetToken(c)

    if err != nil {
        return err
    }

    _, ok := token.Claims.(jwt.MapClaims)
    if ok && token.Valid {
        return nil
    }

    return errors.New("invalid token provided")
}

func GetToken(c *gin.Context) (*jwt.Token, error) {
    tokenString := getTokenFromRequest(c)
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
        }

        return token, nil
    })
    return token, err
}

func getTokenFromRequest(c *gin.Context) string {
    bearerToken := c.Request.Header.Get("Authorization")

    splitToken := strings.Split(bearerToken, " ")
    if len(splitToken) == 2 {
        return splitToken[1]
    }
    return ""
}
登入後複製

有什麼建議如何讓它運作嗎?我缺什麼?謝謝。

解決方法

keyfunc 由 parse 使用方法作為回呼函數來提供驗證金鑰。所以它應該回傳一個金鑰而不是參數 token *jwt.token

token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
    if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
        return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
    }

-   return token, nil
+   return []byte(secretKey), nil
  })
登入後複製

以上是go-jwt 令牌驗證錯誤 - 令牌簽章無效:金鑰類型無效的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!