package handlers import ( "bytes" "encoding/json" "io" "log" "net/http" "pocketbaseSigner/models" ) //1. добавить в хэндлере регистрации переход на логин хэндлер //2. реализовать логин //3. приступить к миддлвейру func LoginHandler(w http.ResponseWriter, r *http.Request) { if r.Method == http.MethodGet { http.ServeFile(w, r, "./web/login_form.html") return } if r.Method == http.MethodPost { err := r.ParseForm() if err != nil { http.Error(w, "Ошибка при обработке формы", http.StatusBadRequest) return } if r.FormValue("email") == "" || r.FormValue("password") == "" { http.Error(w, "Email и пароль обязательны!", http.StatusBadRequest) return } // Создаем структуру для запроса loginData := map[string]string{ "identity": r.FormValue("email"), "password": r.FormValue("password"), } // Преобразуем в JSON jsonData, err := json.Marshal(loginData) if err != nil { log.Printf("Ошибка при создании JSON: %v", err) http.Error(w, "Внутренняя ошибка сервера", http.StatusInternalServerError) return } url := "http://localhost:8090/api/collections/users/auth-with-password" req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) if err != nil { log.Printf("Ошибка при создании запроса: %v", err) http.Error(w, "Внутренняя ошибка сервера", http.StatusInternalServerError) return } req.Header.Set("Content-Type", "application/json") client := &http.Client{} resp, err := client.Do(req) if err != nil { log.Printf("Ошибка при отправке запроса: %v", err) http.Error(w, "Ошибка при подключении к серверу", http.StatusInternalServerError) return } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { log.Printf("Ошибка при чтении ответа: %v", err) http.Error(w, "Ошибка при обработке ответа", http.StatusInternalServerError) return } // Проверяем статус ответа if resp.StatusCode != http.StatusOK { log.Printf("Ошибка авторизации: %s", string(body)) http.Error(w, "Неверный email или пароль", http.StatusUnauthorized) return } // Парсим ответ для получения токена var authResp models.AuthResponse if err := json.Unmarshal(body, &authResp); err != nil { log.Printf("Ошибка при разборе JSON: %v", err) http.Error(w, "Ошибка при обработке ответа", http.StatusInternalServerError) return } // Проверяем наличие токена в ответе if authResp.Token == "" { log.Printf("Токен отсутствует в ответе: %s", string(body)) http.Error(w, "Ошибка авторизации: токен не получен", http.StatusInternalServerError) return } // Логируем успешную авторизацию log.Printf("Успешная авторизация пользователя: %s", authResp.Token) // Сохраняем токен в cookie http.SetCookie(w, &http.Cookie{ Name: "pb_auth", Value: authResp.Token, Path: "/", HttpOnly: true, Secure: true, SameSite: http.SameSiteStrictMode, }) // Сохраняем ID пользователя в отдельную cookie http.SetCookie(w, &http.Cookie{ Name: "user_id", Value: authResp.Record.ID, Path: "/", HttpOnly: true, Secure: true, SameSite: http.SameSiteStrictMode, }) // Перенаправляем на dashboard http.Redirect(w, r, "/dashboard", http.StatusSeeOther) } }