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

WBOY
Lepaskan: 2024-02-08 22:10:18
ke hadapan
437 orang telah melayarinya

无效的内存地址或 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
}
Salin selepas log masuk

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,
            })
        }
}
Salin selepas log masuk

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

    .
    .
    .
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!