首頁 >後端開發 >Golang >無效的記憶體位址或 nil 指標取消引用驗證 jwt 過期時間

無效的記憶體位址或 nil 指標取消引用驗證 jwt 過期時間

WBOY
WBOY轉載
2024-02-08 22:10:18483瀏覽

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

php小編小新為您介紹驗證JWT過期時間時的常見問題。在使用JWT進行身份驗證時,我們經常需要驗證令牌是否過期。然而,有時候我們可能會遇到一些錯誤,例如無效的記憶體位址或nil指標取消引用。這些錯誤可能會導致令牌驗證失敗。本文將為您解析這些問題的原因,並提供解決方案,以幫助您順利驗證JWT的過期時間。

問題內容

我正在使用jwt 令牌使用golang 進行登錄,到目前為止一切都很順利,它檢查令牌上還剩下什麼時間,如果沒有令牌,它會發送一條訊息 但我有兩個問題,如果令牌無效或過期時間已過,則會顯示此錯誤:

攜帶錯誤的行是這樣的 claims := token.claims.(*jwtcustomclaims)

#我的 jwtcustomclaims 變數是這樣的:

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
}

使用這個結構體也會產生令牌,檢查令牌的完整函數是這個

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

為了檢查它是否驗證令牌,我只是嘗試從其他項目中放入另一種類型的令牌,並將其寫錯只是為了測試,但它會發送控制台錯誤。對於過期時間,我在網上查看了錯誤,解決方案是像這樣編寫if claims == nil 但它不起作用,我不知道還能做什麼

解決方法

請測試一下:

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

    .
    .
    .
}

以上是無效的記憶體位址或 nil 指標取消引用驗證 jwt 過期時間的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除