package helper import ( "fmt" "time" "wm-backend/global" "github.com/golang-jwt/jwt/v5" "github.com/rs/zerolog/log" ) // GenerateToken tạo JWT token cho user func GenerateToken(userID string) (string, error) { claims := jwt.MapClaims{ "user_id": userID, "iat": time.Now().Unix(), // issued at "exp": time.Now().Add(time.Duration(global.Cfg.JWT.ExpirationHours) * time.Hour * 7).Unix(), // expiry } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString([]byte(global.Cfg.JWT.SecretKey)) // <-- lấy từ config } func ParseToken(tokenString string) (jwt.MapClaims, error) { log.Debug().Str("token", tokenString).Msg("Parsing JWT token") token, err := jwt.Parse(tokenString, func(token *jwt.Token) (any, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return []byte(global.Cfg.JWT.SecretKey), nil // <-- lấy từ config }) log.Debug().Interface("token", token).Msg("Parsed JWT token object") if err != nil { return nil, err } log.Debug().Interface("claims", token.Claims).Msg("Parsed JWT claims") if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { log.Debug().Interface("claims", claims).Msg("Valid JWT claims extracted") return claims, nil } log.Error().Msg("Invalid JWT token: claims not valid or token not valid") return nil, fmt.Errorf("invalid token") }