L'éditeur de php, Xiaoxin, vous présentera les problèmes courants lors de la vérification du délai d'expiration JWT. Lorsque nous utilisons JWT pour l'authentification, nous devons souvent vérifier si le jeton a expiré. Cependant, nous pouvons parfois rencontrer des erreurs telles qu'une adresse mémoire invalide ou un déréférencement de pointeur nul. Ces erreurs peuvent entraîner l’échec de la validation du jeton. Cet article analysera pour vous les causes de ces problèmes et fournira des solutions pour vous aider à vérifier avec succès le délai d'expiration de JWT.
J'utilise Golang pour me connecter à l'aide du jeton jwt, jusqu'à présent, tout se passe bien, il vérifie l'heure restante sur le jeton et s'il n'y a pas de jeton, il envoie un message Mais j'ai deux problèmes, si le token n'est pas valide ou si le délai d'expiration est dépassé, il affiche cette erreur :
La ligne portant l'erreur est comme ceci
claims := token.claims.(*jwtcustomclaims)
Ma variable jwtcustomclaims ressemble à ceci :
type jwtcustomclaims struct { user string `json:"email"` nombre string `json:"nombre"` apellido string `json:"apellido"` edad int `json:"edad"` genero string `json:"genero"` rol string `json:"rol"` jwt.standardclaims }
L'utilisation de cette structure générera également un jeton. La fonction complète pour vérifier le jeton est la suivante
.func ValidateToken(tokenString string, secretKey string, c *fiber.Ctx) (*jwt.Token, error) { token, err := jwt.ParseWithClaims(tokenString, &jwtCustomClaims{}, func(token *jwt.Token) (interface{}, error) { return []byte(secretKey), nil }) if err != nil { if err == jwt.ErrSignatureInvalid { return nil, err } return nil, c.JSON(fiber.Map{ "message": "Unauthorized", "code": 400, }) } _, ok := token.Claims.(*jwtCustomClaims) if !ok || !token.Valid { return nil, c.JSON(fiber.Map{ "message": "Unauthorized", "code": 400, }) } return token, nil } func TokenMiddleware(c *fiber.Ctx) error { tokenString := c.Get("Authorization") if tokenString == "" { return c.JSON(fiber.Map{ "message": "No token", "code": 400, }) } // Separa el token del encabezado "Bearer" tokenString = strings.ReplaceAll(tokenString, "Bearer ", "") token, err := ValidateToken(tokenString, os.Getenv("SECRET"), c) if err != nil { return err } claims := token.Claims.(*jwtCustomClaims) expiresIn := time.Until(time.Unix(claims.ExpiresAt, 0)) if expiresIn > 0 { return c.JSON(fiber.Map{ "message": "Token is valid", "expires_in": expiresIn.String(), "is_expired": false, }) //return c.Next() } else { return c.JSON(fiber.Map{ "message": "Token is valid but expired", "expires_in": 0, "is_expired": true, }) } }
Pour vérifier s'il valide le jeton, j'ai juste essayé de mettre un autre type de jeton d'un autre projet et de l'écrire mal juste pour tester, mais cela envoie une erreur de console. Pour le délai d'expiration, j'ai regardé l'erreur en ligne et la solution était d'écrire comme ça if claims == nil
mais ça n'a pas fonctionné et je ne sais pas quoi faire d'autre
Veuillez la tester :
func ValidateToken(tokenString string, secretKey string, c *fiber.Ctx) (jwtCustomClaims, error) { var claims jwtCustomClaims token, err := jwt.ParseWithClaims(tokenString, &claims, func(token *jwt.Token) (interface{}, error) { return []byte(secretKey), nil }) if err != nil { if err == jwt.ErrSignatureInvalid { return jwtCustomClaims{}, err } return jwtCustomClaims{}, c.JSON(fiber.Map{ "message": "Unauthorized", "code": 400, }) } if !token.Valid { return jwtCustomClaims{}, c.JSON(fiber.Map{ "message": "Unauthorized", "code": 400, }) } return claims, nil } func TokenMiddleware(c *fiber.Ctx) error { . . . claims, err := ValidateToken(tokenString, os.Getenv("SECRET"), c) if err != nil { return err } expiresIn := time.Until(time.Unix(claims.ExpiresAt, 0)) . . . }
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!