Maison  >  Article  >  développement back-end  >  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

王林
王林avant
2024-02-08 21:15:31374parcourir

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

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

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

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer