Editor php, Xiaoxin, akan memperkenalkan anda kepada masalah biasa apabila mengesahkan masa tamat tempoh JWT. Apabila menggunakan JWT untuk pengesahan, kami selalunya perlu mengesahkan sama ada token telah tamat tempoh. Walau bagaimanapun, kadangkala kita mungkin menghadapi beberapa ralat seperti alamat memori yang tidak sah atau penolakan penunjuk nil. Ralat ini boleh menyebabkan pengesahan token gagal. Artikel ini akan menganalisis punca masalah ini untuk anda dan menyediakan penyelesaian untuk membantu anda berjaya mengesahkan masa tamat tempoh JWT.
Saya menggunakan golang untuk log masuk menggunakan token jwt, setakat ini semuanya berjalan lancar, ia menyemak jam berapa yang tinggal pada token dan jika tiada token ia menghantar mesej Tetapi saya mempunyai dua masalah, jika token tidak sah atau masa tamat tempoh telah berlalu, ia menunjukkan ralat ini:
Barisan yang membawa ralat adalah seperti ini
claims := token.claims.(*jwtcustomclaims)
Pembolehubah jwtcustomclaims saya kelihatan seperti ini:
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 }
Menggunakan struktur ini juga akan menghasilkan token Fungsi lengkap untuk menyemak token adalah ini
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, }) } }
Untuk menyemak sama ada ia mengesahkan token, saya hanya cuba memasukkan jenis token lain daripada projek lain dan menulisnya dengan salah hanya untuk menguji, tetapi ia menghantar ralat konsol. Untuk masa tamat tempoh, saya melihat ralat dalam talian dan penyelesaiannya ialah menulis seperti ini if claims == nil
tetapi ia tidak berfungsi dan saya tidak tahu apa lagi yang perlu dilakukan
Sila uji:
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)) . . . }
Atas ialah kandungan terperinci Alamat memori tidak sah atau pengesahan penyahrujukan penunjuk nol jwt masa tamat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!