96 lines
2.5 KiB
Go
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)
|
|
}
|