Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Alamat memori tidak sah atau pengesahan penyahrujukan penunjuk nol jwt masa tamat

Alamat memori tidak sah atau pengesahan penyahrujukan penunjuk nol jwt masa tamat

WBOY
WBOYke hadapan
2024-02-08 22:10:18414semak imbas

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

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.

Kandungan soalan

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

Penyelesaian

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam