Files
testjwtauth/routes/me.go
T
2024-12-06 16:10:35 +03:00

80 lines
1.6 KiB
Go

package routes
import (
"time"
"desq.com.ru/testjwtauth/handlers"
"github.com/gofiber/fiber/v2"
"github.com/golang-jwt/jwt/v5"
"github.com/google/uuid"
"gorm.io/gorm"
)
func setRTCookie(c *fiber.Ctx, RT string, expires time.Time) {
c.Cookie(&fiber.Cookie{
Name: "refreshToken",
Value: RT,
HTTPOnly: true,
Expires: expires,
})
}
func CreateToken(c *fiber.Ctx) error {
DB := c.Locals("db").(*gorm.DB)
uID := c.Params("id")
userID, err := uuid.Parse(uID)
if err != nil {
return c.Status(500).SendString(err.Error())
}
expires := time.Now().Add(time.Hour * 24)
T, RT, err := handlers.CreateToken(DB, userID, c.IP(), expires.Unix())
if err != nil {
return c.Status(500).SendString(err.Error())
}
setRTCookie(c, RT, expires)
return c.Status(201).JSON(fiber.Map{
"token": T,
})
}
func RefreshToken(c *fiber.Ctx) error {
DB := c.Locals("db").(*gorm.DB)
claims := c.Locals("user").(*jwt.Token).Claims.(jwt.MapClaims)
RT := c.Cookies("refreshToken")
if RT == "" {
return c.Status(400).SendString("Refresh cookie must be set")
}
uID := claims["userId"].(string)
userID, err := uuid.Parse(uID)
if err != nil {
return c.Status(500).SendString(err.Error())
}
err = handlers.RefreshToken(DB, userID, claims, RT, c.IP())
if err != nil {
return c.Status(401).SendString(err.Error())
}
expires := time.Now().Add(time.Hour * 24)
t, RT, err := handlers.CreateToken(DB, userID, c.IP(), expires.Unix())
if err != nil {
return c.Status(500).SendString(err.Error())
}
setRTCookie(c, RT, expires)
return c.Status(200).JSON(fiber.Map{
"token": t,
})
}