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中文網其他相關文章!