package main import ( "cmp" "context" "crypto/rand" "encoding/base64" "maps" "net/http" "time" "github.com/golang-jwt/jwt/v5" "github.com/labstack/echo/v4" "github.com/zoriya/kyoo/keibi/dbc" ) type LoginDto struct { Login string `json:"login" validate:"required"` Password string `json:"password" validate:"required"` } func (h *Handler) createSession(c echo.Context, user *User) error { ctx := context.Background() id := make([]byte, 64) _, err := rand.Read(id) if err != nil { return err } dev := cmp.Or(c.Param("device"), c.Request().Header.Get("User-Agent")) device := &dev if dev == "" { device = nil } session, err := h.db.CreateSession(ctx, dbc.CreateSessionParams{ ID: base64.StdEncoding.EncodeToString(id), UserID: user.ID, Device: device, }) if err != nil { return err } return c.JSON(201, session) } func (h *Handler) CreateJwt(c echo.Context, user *User) error { claims := maps.Clone(user.Claims) claims["sub"] = user.ID.String() claims["iss"] = h.config.Issuer claims["exp"] = &jwt.NumericDate{ Time: time.Now().UTC().Add(time.Hour), } claims["iss"] = &jwt.NumericDate{ Time: time.Now().UTC(), } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) t, err := token.SignedString(h.config.JwtSecret) if err != nil { return err } return c.JSON(http.StatusOK, echo.Map{ "token": t, }) }