Maison >développement back-end >Golang >Adresse mémoire invalide ou délai d'expiration jwt de validation de déréférencement de pointeur nul

Adresse mémoire invalide ou délai d'expiration jwt de validation de déréférencement de pointeur nul

WBOY
WBOYavant
2024-02-08 22:10:18490parcourir

无效的内存地址或 nil 指针取消引用验证 jwt 过期时间

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.

Contenu de la question

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

Solution de contournement

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!

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