Kyoo/auth/session.go
2024-10-19 18:09:21 +02:00

67 lines
1.3 KiB
Go

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,
})
}