Maison > développement back-end > Golang > Erreur de validation du jeton go-jwt - signature du jeton non valide : type de clé non valide

Erreur de validation du jeton go-jwt - signature du jeton non valide : type de clé non valide

王林
Libérer: 2024-02-08 21:15:31
avant
492 Les gens l'ont consulté

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

L'éditeur PHP Zimo peut rencontrer le message d'erreur : "Signature de jeton invalide : type de clé invalide" lors de l'utilisation de go-jwt pour la vérification du jeton. Cette erreur est due à une inadéquation entre la signature du jeton et le type de clé. La signature du jeton est un élément important de la validation du jeton et le type de clé spécifie l'algorithme utilisé pour générer et vérifier la signature. Pour résoudre ce problème, nous devons nous assurer que l'algorithme de signature du jeton est cohérent avec le type de clé. Ensuite, nous détaillerons comment configurer et utiliser correctement go-jwt pour éviter cette erreur.

Contenu de la question

Une erreur s'est produite

token signature is invalid: key is of invalid type
Copier après la connexion

Lorsque vous essayez de vérifier le jeton jwt. Utilisez la bibliothèque golang-jwt (v5).

Voici comment je génère le jeton :

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))
}
Copier après la connexion

Voici le jeton généré :

Voici comment je vérifie le jeton :

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 ""
}
Copier après la connexion

Des suggestions pour le faire fonctionner ? Qu'est-ce que je rate? Merci.

Solution

keyfunc Utilisez la méthode par analyse comme fonction de rappel pour fournir la clé de vérification. Il devrait donc renvoyer une clé au lieu du paramètre 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
  })
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal