golang jwt

package main

import (
    "fmt"
    "time"

    "github.com/dgrijalva/jwt-go"
)

var secretKey = []byte("your_secret_key")

type CustomClaims struct {
    UserID int    `json:"user_id"`
    Role   string `json:"role"`
    jwt.StandardClaims
}

func generateJWT(userID int, role string) (string, error) {
    claims := CustomClaims{
        UserID: userID,
        Role:   role,
        StandardClaims: jwt.StandardClaims{
            ExpiresAt: time.Now().Add(time.Hour * 24).Unix(), // Token expires in 24 hours
        },
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    signedToken, err := token.SignedString(secretKey)
    if err != nil {
        return "", err
    }

    return signedToken, nil
}

func parseJWT(tokenString string) (*CustomClaims, error) {
    token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
        return secretKey, nil
    })

    if err != nil {
        return nil, err
    }

    claims, ok := token.Claims.(*CustomClaims)
    if !ok || !token.Valid {
        return nil, fmt.Errorf("invalid token")
    }

    return claims, nil
}

func main() {
    userID := 123
    role := "admin"

    token, err := generateJWT(userID, role)
    if err != nil {
        fmt.Println("Error generating JWT:", err)
        return
    }

    fmt.Println("Generated JWT:", token)

    parsedClaims, err := parseJWT(token)
    if err != nil {
        fmt.Println("Error parsing JWT:", err)
        return
    }

    fmt.Printf("Parsed JWT claims: UserID=%d, Role=%s\n", parsedClaims.UserID, parsedClaims.Role)
}