Files
uPortal2/backend/internal/rest/handler_auth.go
T
2026-10-21 20:28:50 +03:00

96 lines
2.5 KiB
Go

package rest
import (
"net/http"
"goAuth/internal/auth"
"goAuth/internal/user"
)
type signupRequest struct {
Login string `json:"login"`
Password string `json:"password"`
Invite string `json:"invite"`
}
type signinRequest struct {
Login string `json:"login"`
Password string `json:"password"`
Remember bool `json:"remember"`
}
func (h *Handler) signup(w http.ResponseWriter, r *http.Request) {
var req signupRequest
if err := decodeJson(r, &req); err != nil {
writeError(w, http.StatusBadRequest, "invalid request body")
return
}
if !verifyLogin(req.Login) {
writeError(w, http.StatusBadRequest, "invalid login")
return
}
if !verifyPassword(req.Password) {
writeError(w, http.StatusBadRequest, "invalid password")
return
}
if req.Invite == "" {
writeError(w, http.StatusBadRequest, "invite is required")
return
}
address := auth.ExtractIP(r)
device := h.sessions.ClassifiedUserAgent(r.UserAgent())
u, session, err := h.sessions.RegisterUser(r.Context(), req.Login, req.Password, req.Invite, address, device)
if err != nil {
h.fail(w, err)
return
}
auth.SigninSetup(w, h.cfg.Cookies.SessionName, session.Token, session.ExpiresAt, h.cfg.Cookies.Secure)
h.refreshCsrf(w)
writeJson(w, http.StatusCreated, newUserResponse(u))
}
func (h *Handler) signin(w http.ResponseWriter, r *http.Request) {
var req signinRequest
if err := decodeJson(r, &req); err != nil {
writeError(w, http.StatusBadRequest, "invalid request body")
return
}
if req.Login == "" || req.Password == "" {
writeError(w, http.StatusBadRequest, "login and password are required")
return
}
address := auth.ExtractIP(r)
device := h.sessions.ClassifiedUserAgent(r.UserAgent())
u, session, err := h.sessions.LoginUser(r.Context(), req.Login, req.Password, address, device, req.Remember)
if err != nil {
if err == user.ErrNotFound || err == user.ErrInvalidPassword {
writeError(w, http.StatusUnauthorized, "invalid credentials")
return
}
h.fail(w, err)
return
}
auth.SigninSetup(w, h.cfg.Cookies.SessionName, session.Token, session.ExpiresAt, h.cfg.Cookies.Secure)
h.refreshCsrf(w)
writeJson(w, http.StatusOK, newUserResponse(u))
}
func (h *Handler) signout(w http.ResponseWriter, r *http.Request) {
session := sessionFromRequest(r)
if err := h.sessions.DeleteSession(r.Context(), session); err != nil {
h.fail(w, err)
return
}
auth.SignoutCleanup(w, h.cfg.Cookies.SessionName, h.cfg.Cookies.Secure)
h.refreshCsrf(w)
writeNoContent(w)
}