104 lines
2.3 KiB
Go
104 lines
2.3 KiB
Go
package auth
|
|
|
|
import (
|
|
"errors"
|
|
"system-trace/core/constants"
|
|
"system-trace/core/database"
|
|
"system-trace/core/services/users"
|
|
"system-trace/core/types"
|
|
"system-trace/core/validators"
|
|
"time"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
// MARK: ReqTokens godoc
|
|
// @Summary Request pair of tokens
|
|
// @Description Returns pair of access and refresh tokens
|
|
// @Tags auth
|
|
// @Produce json
|
|
// @Param request body types.AuthBody true "Request body"
|
|
// @Header 200 {string} Set-Cookie "accessToken=..."
|
|
// @Header 200 {string} Set-Cookie "refreshToken=..."
|
|
// @Success 200
|
|
// @Router /auth/login [post]
|
|
func ReqTokensHandler(c *fiber.Ctx) error {
|
|
ab := new(types.AuthBody)
|
|
if err := c.BodyParser(ab); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
|
|
Error: err.Error(),
|
|
})
|
|
}
|
|
|
|
if err := validators.Validate(c, ab); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
|
|
Error: err.Error(),
|
|
})
|
|
}
|
|
|
|
u, err := database.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(types.JSONError{
|
|
Error: e,
|
|
})
|
|
}
|
|
|
|
if u != nil {
|
|
err = GeneratePairAndSetCookie(c, u.ID)
|
|
if err != nil {
|
|
return c.
|
|
Status(fiber.StatusBadRequest).
|
|
JSON(types.JSONError{
|
|
Error: err.Error(),
|
|
})
|
|
}
|
|
|
|
err = users.SetLoginTime(u)
|
|
if err != nil {
|
|
return c.
|
|
Status(fiber.StatusBadRequest).
|
|
JSON(types.JSONError{
|
|
Error: err.Error(),
|
|
})
|
|
}
|
|
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 *types.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)
|
|
}
|