pocketbase-signer/handlers/login.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)
}
}