package handlers import ( "aidanwoods.dev/go-paseto" "log/slog" "net/http" "ron" "strings" "time" ) type UserPayload struct { User string `json:"user"` Role string `json:"role"` } func (hq *Handlers) CreateToken(c *ron.Context) { token := paseto.NewToken() token.Set("userPayload", UserPayload{User: "pedro", Role: "admin"}) token.SetExpiration(time.Now().Add(hq.app.Security.Duration)) signed := token.V4Sign(hq.app.Security.AsymmetricKey, nil) cookie := http.Cookie{ Name: "token", Value: signed, Path: "/", MaxAge: 3600, HttpOnly: true, Secure: true, SameSite: http.SameSiteLaxMode, } http.SetCookie(c.W, &cookie) c.JSON(http.StatusOK, ron.Data{"token": signed}) } func (hq *Handlers) ValidateTokenAuthorization(c *ron.Context) { signed := c.R.Header.Get("Authorization") split := strings.Split(signed, "Bearer ") slog.Info("signed", "signed", split[1]) parser := paseto.NewParser() token, err := parser.ParseV4Public(hq.app.Security.PublicKey, split[1], nil) if err != nil { slog.Error("error", "err", err) c.JSON(http.StatusUnauthorized, ron.Data{"error": err.Error()}) return } var userPayload UserPayload token.Get("userPayload", &userPayload) c.JSON(http.StatusOK, ron.Data{ "authorized": true, "payload": userPayload, }) } func (hq *Handlers) ValidateTokenCookie(c *ron.Context) { cookie, err := c.R.Cookie("token") if err != nil { slog.Error("error", "err", err) c.JSON(http.StatusUnauthorized, ron.Data{"error": err.Error()}) return } parser := paseto.NewParser() token, err := parser.ParseV4Public(hq.app.Security.PublicKey, cookie.Value, nil) if err != nil { slog.Error("error", "err", err) c.JSON(http.StatusUnauthorized, ron.Data{"error": err.Error()}) return } var userPayload UserPayload token.Get("userPayload", &userPayload) c.JSON(http.StatusOK, ron.Data{ "authorized": true, "payload": userPayload, }) }