132 lines
4.1 KiB
Go
132 lines
4.1 KiB
Go
package handlers
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"pocketbaseSigner/config"
|
|
"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
|
|
}
|
|
|
|
user := models.LoginForm{
|
|
Email: r.FormValue("email"),
|
|
Password: r.FormValue("password"),
|
|
}
|
|
|
|
// Проверяем обязательные поля
|
|
if user.Email == "" || user.Password == "" {
|
|
http.Error(w, "Email и пароль обязательны!", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
// Подготавливаем данные для отправки
|
|
dataMap := map[string]string{
|
|
"identity": user.Email,
|
|
"password": user.Password,
|
|
}
|
|
|
|
data, err := json.Marshal(dataMap)
|
|
if err != nil {
|
|
log.Printf("Ошибка при создании JSON: %v", err)
|
|
http.Error(w, "Внутренняя ошибка сервера", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
log.Printf("Отправляем данные пользователя: %+v\n", user)
|
|
|
|
url := config.PocketBaseURL + "/api/collections/users/auth-with-password"
|
|
log.Printf("URL: %v\n", url)
|
|
req, err := http.NewRequest("POST", url, bytes.NewBuffer(data))
|
|
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)
|
|
}
|
|
}
|