core/auth/auth.go
2024-05-16 04:16:05 +07:00

88 lines
1.9 KiB
Go

package auth
import (
"errors"
"system-trace/core/app/constants"
"system-trace/core/users"
"system-trace/core/validators"
"time"
"github.com/gofiber/fiber/v2"
)
// ReqTokens godoc
// @Summary Request pair of tokens
// @Description Returns pair of access and refresh tokens
// @Tags auth
// @Produce json
// @Param request body AuthBody true "Request body"
// @Header 200 {string} Token "accessToken=..."
// @Header 200 {string} Set-Cookie "refreshToken=..."
// @Success 200
// @Router /auth/login [post]
func ReqTokens(c *fiber.Ctx) error {
ab := new(AuthBody)
if err := c.BodyParser(ab); err != nil {
return err
}
if err := validators.Validate(c, ab); err != nil {
return err
}
u, err := users.FindByEmailAndPassword(ab.Email, ab.Password)
if err != nil {
e := err.Error()
if e == "sql: no rows in result set" {
e = constants.AUTH_FAILED
}
return c.
Status(fiber.StatusBadRequest).
JSON(fiber.Map{
"error": e,
})
}
if u != nil {
err = GeneratePairAndSetCookie(c, u.ID)
if err != nil {
return c.
Status(fiber.StatusBadRequest).
JSON(fiber.Map{
"error": err.Error(),
})
}
users.Login(u)
return c.SendStatus(fiber.StatusOK)
}
return errors.New(constants.AUTH_FAILED)
}
func GeneratePairAndSetCookie(c *fiber.Ctx, id int32) error {
p, err := genPair(id)
if err != nil {
return err
}
setCookie(c, p)
return nil
}
func setCookie(c *fiber.Ctx, p *PairTokens) {
// Access token
atc := new(fiber.Cookie)
atc.Name = "accessToken"
atc.Value = p.AccessToken
atc.Expires = time.Now().Add(time.Duration(AccessTokenLifetime) * time.Hour)
atc.Secure = true
atc.HTTPOnly = true
c.Cookie(atc)
// Refresh token
rtc := new(fiber.Cookie)
rtc.Name = "refreshToken"
rtc.Value = p.RefreshToken
rtc.Expires = time.Now().Add(time.Duration(RefreshTokenLifetime) * time.Hour)
rtc.Secure = true
rtc.HTTPOnly = true
c.Cookie(rtc)
}