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

王林
Freigeben: 2024-02-08 21:15:31
nach vorne
435 Leute haben es durchsucht

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
Nach dem Login kopieren

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))
}
Nach dem Login kopieren

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 ""
}
Nach dem Login kopieren

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
  })
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage