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