80 lines
1.6 KiB
Go
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,
|
|
})
|
|
}
|