Heim  >  Artikel  >  Backend-Entwicklung  >  go-jwt-Token-Validierungsfehler – ungültige Token-Signatur: Ungültiger Schlüsseltyp

go-jwt-Token-Validierungsfehler – ungültige Token-Signatur: Ungültiger Schlüsseltyp

王林
王林nach vorne
2024-02-08 21:15:31374Durchsuche

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

Der PHP-Editor Zimo kann auf die Fehlermeldung „Ungültige Token-Signatur: Ungültiger Schlüsseltyp“ stoßen, wenn er go-jwt für die Token-Überprüfung verwendet. Dieser Fehler wird durch eine Nichtübereinstimmung zwischen der Signatur des Tokens und dem Schlüsseltyp verursacht. Die Token-Signatur ist ein wichtiger Teil der Validierung des Tokens, und der Schlüsseltyp gibt den Algorithmus an, der zum Generieren und Überprüfen der Signatur verwendet wird. Um dieses Problem zu lösen, müssen wir sicherstellen, dass der Signaturalgorithmus des Tokens mit dem Schlüsseltyp übereinstimmt. Als Nächstes erfahren Sie, wie Sie go-jwt richtig konfigurieren und verwenden, um diesen Fehler zu vermeiden.

Frageninhalt

Es ist ein Fehler aufgetreten

token signature is invalid: key is of invalid type

Beim Versuch, das JWT-Token zu überprüfen. Verwenden Sie die Bibliothek golang-jwt (v5).

So generiere ich den Token:

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))
}

Dies ist das generierte Token:

So verifiziere ich den Token:

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 ""
}

Irgendwelche Vorschläge, wie es funktioniert? Was vermisse ich? Danke.

Workaround

keyfunc Verwenden Sie die Methode „parse“ als Rückruffunktion, um den Bestätigungsschlüssel bereitzustellen. Es sollte also einen Schlüssel anstelle des Parameters token *jwt.token zurückgeben.

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
  })

Das obige ist der detaillierte Inhalt vongo-jwt-Token-Validierungsfehler – ungültige Token-Signatur: Ungültiger Schlüsseltyp. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen