package main import ( "github.com/golang-jwt/jwt/v5" "golang.org/x/crypto/bcrypt" "time" ) // User represents an admin user for authentication type User struct { ID int Username string PasswordHash string CreatedAt time.Time } // HashPassword hashes a plain password using bcrypt func HashPassword(password string) (string, error) { hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) return string(hash), err } // CheckPasswordHash compares a plain password with a bcrypt hash func CheckPasswordHash(password, hash string) bool { return bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) == nil } // JWT secret key (should be loaded from config in production) var jwtSecret = []byte("replace_this_with_a_secure_secret") // GenerateJWT generates a JWT token for a user func GenerateJWT(username string) (string, error) { claims := jwt.MapClaims{ "username": username, "exp": time.Now().Add(24 * time.Hour).Unix(), } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret) } // ValidateJWT validates a JWT token and returns the username if valid func ValidateJWT(tokenString string) (string, error) { token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { return jwtSecret, nil }) if err != nil || !token.Valid { return "", err } claims, ok := token.Claims.(jwt.MapClaims) if !ok { return "", err } username, ok := claims["username"].(string) if !ok { return "", err } return username, nil }