Maison > développement back-end > Golang > le corps du texte

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

WBOY
Libérer: 2024-02-08 22:10:18
avant
438 Les gens l'ont consulté

无效的内存地址或 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
}
Copier après la connexion

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

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

    .
    .
    .
}
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!