package main import ( "bytes" "encoding/json" "fmt" "io" "log" "net/http" "golang.org/x/crypto/bcrypt" ) const ( nocoURL = "https://nocodb.shaiheprjct.ru/api/v2/tables/mqvqd88xe01rxap/records" apiToken = "eVqxLwbUQRLQHQ3g44js9vfLHvIdWhllLZwKfW25" ) type User struct { Username string `json:"username"` Password string `json:"password"` } func main() { http.HandleFunc("/", homePage) http.HandleFunc("/register", registerHandler) http.HandleFunc("/login", loginHandler) log.Println("✅ Сервер запускается на порту :9000") if err := http.ListenAndServe(":9000", nil); err != nil { log.Fatalf("❌ Ошибка запуска сервера: %v", err) } } func registerHandler(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { username := r.FormValue("username") password := r.FormValue("password") log.Printf("--> Регистрация пользователя: %s", username) hash, _ := bcrypt.GenerateFromPassword([]byte(password), 10) jsonData, _ := json.Marshal(map[string]string{ "username": username, "password": string(hash), }) req, _ := http.NewRequest("POST", nocoURL, bytes.NewBuffer(jsonData)) req.Header.Set("xc-token", apiToken) req.Header.Set("Content-Type", "application/json") client := &http.Client{} resp, err := client.Do(req) if err != nil { log.Printf("❌ Ошибка запроса к NocoDB: %v", err) http.Error(w, err.Error(), 500) return } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) log.Printf("<-- Ответ NocoDB (Статус %d): %s", resp.StatusCode, string(body)) if resp.StatusCode < 300 { fmt.Fprint(w, "Регистрация успешна!") } else { http.Error(w, "NocoDB error: "+string(body), 500) } } } func loginHandler(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { user := r.FormValue("username") pass := r.FormValue("password") log.Printf("--> Попытка входа: %s", user) // Поиск в NocoDB searchURL := fmt.Sprintf("%s?where=(username,eq,%s)", nocoURL, user) req, _ := http.NewRequest("GET", searchURL, nil) req.Header.Set("xc-token", apiToken) client := &http.Client{} resp, err := client.Do(req) if err != nil { log.Printf("❌ Ошибка при поиске пользователя: %v", err) http.Error(w, err.Error(), 500) return } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) log.Printf("<-- Ответ NocoDB (Логин): %s", string(body)) var result struct { List []User `json:"list"` } if err := json.Unmarshal(body, &result); err != nil { log.Printf("❌ Ошибка парсинга JSON: %v", err) http.Error(w, "Ошибка данных", 500) return } if len(result.List) > 0 { err := bcrypt.CompareHashAndPassword([]byte(result.List[0].Password), []byte(pass)) if err == nil { log.Printf("✅ Пользователь %s успешно вошел", user) fmt.Fprintf(w, "Добро пожаловать, %s!", user) return } } log.Printf("⚠️ Неудачная попытка входа для: %s", user) fmt.Fprint(w, "Ошибка авторизации") } } func homePage(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html; charset=utf-8") fmt.Fprint(w, `

Личный кабинет


`) }