package utils import ( "errors" "time" "cardverse/config" "github.com/golang-jwt/jwt/v5" ) type Claims struct { UserID uint `json:"user_id"` Email string `json:"email,omitempty"` Role string `json:"role,omitempty"` jwt.RegisteredClaims } func GenerateAccessToken(userID uint, email string, role string) (string, error) { cfg := config.Cfg expiration := time.Now().Add(time.Duration(cfg.JWTExpiresHours) * time.Hour) claims := Claims{ UserID: userID, Email: email, Role: role, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(expiration), IssuedAt: jwt.NewNumericDate(time.Now()), }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString([]byte(cfg.JWTSecret)) } func GenerateRefreshToken(userID uint) (string, error) { cfg := config.Cfg expiration := time.Now().Add(time.Duration(cfg.JWTRefreshExpiresHours) * time.Hour) claims := Claims{ UserID: userID, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(expiration), IssuedAt: jwt.NewNumericDate(time.Now()), }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString([]byte(cfg.JWTRefreshSecret)) } func GenerateToken(userID uint, email string, role string) (string, error) { return GenerateAccessToken(userID, email, role) } func ValidateToken(tokenString string) (*Claims, error) { cfg := config.Cfg claims := &Claims{} token, err := jwt.ParseWithClaims(tokenString, claims, func(t *jwt.Token) (interface{}, error) { if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok { return nil, errors.New("metode signing token tidak valid") } return []byte(cfg.JWTSecret), nil }) if err != nil { return nil, err } if !token.Valid { return nil, errors.New("token tidak valid") } return claims, nil } func ValidateRefreshToken(tokenString string) (*Claims, error) { cfg := config.Cfg claims := &Claims{} token, err := jwt.ParseWithClaims(tokenString, claims, func(t *jwt.Token) (interface{}, error) { if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok { return nil, errors.New("metode signing token tidak valid") } return []byte(cfg.JWTRefreshSecret), nil }) if err != nil { return nil, err } if !token.Valid { return nil, errors.New("refresh token tidak valid") } return claims, nil }