aboutsummaryrefslogtreecommitdiffstats
path: root/api/middleware
diff options
context:
space:
mode:
authorLeonardo Bishop <me@leonardobishop.com>2025-08-14 18:07:12 +0100
committerLeonardo Bishop <me@leonardobishop.com>2025-08-14 18:07:12 +0100
commit4697556cac819c47d068819b9fc9c3b4ea84e279 (patch)
treeb832d8fc6b643a8b9d0eeca35c1268e1649da731 /api/middleware
parentdd49c9205bb04844b686b9c3396c40eb49d25826 (diff)
Merge confplanner-web and replace fiber with native net/http
Diffstat (limited to 'api/middleware')
-rw-r--r--api/middleware/auth.go62
1 files changed, 34 insertions, 28 deletions
diff --git a/api/middleware/auth.go b/api/middleware/auth.go
index 611276a..eb362b0 100644
--- a/api/middleware/auth.go
+++ b/api/middleware/auth.go
@@ -1,46 +1,52 @@
package middleware
import (
+ "context"
"errors"
+ "net/http"
"github.com/LMBishop/confplanner/api/dto"
+ "github.com/LMBishop/confplanner/pkg/session"
"github.com/LMBishop/confplanner/pkg/user"
- "github.com/gofiber/fiber/v2"
- "github.com/gofiber/fiber/v2/middleware/session"
)
-func RequireAuthenticated(service user.Service, store *session.Store) fiber.Handler {
- return func(c *fiber.Ctx) error {
- s, err := store.Get(c)
- if err != nil {
- return err
- }
-
- if s.Fresh() || len(s.Keys()) == 0 {
- return &dto.ErrorResponse{
- Code: fiber.StatusUnauthorized,
- Message: "Unauthorized",
+func MustAuthenticate(service user.Service, store session.Service) func(http.HandlerFunc) http.HandlerFunc {
+ return func(next http.HandlerFunc) http.HandlerFunc {
+ return func(w http.ResponseWriter, r *http.Request) {
+ var sessionToken string
+ for _, cookie := range r.Cookies() {
+ if cookie.Name == "confplanner_session" {
+ sessionToken = cookie.Value
+ break
+ }
}
- }
- uid := s.Get("uid").(int32)
+ s := store.GetByToken(sessionToken)
+ if s == nil {
+ dto.WriteDto(w, r, &dto.ErrorResponse{
+ Code: http.StatusUnauthorized,
+ Message: "Unauthorized",
+ })
+ return
+ }
- fetchedUser, err := service.GetUserByID(uid)
- if err != nil {
- if errors.Is(err, user.ErrUserNotFound) {
- s.Destroy()
- return &dto.ErrorResponse{
- Code: fiber.StatusUnauthorized,
- Message: "Invalid session",
+ _, err := service.GetUserByID(s.UserID)
+ if err != nil {
+ if errors.Is(err, user.ErrUserNotFound) {
+ store.Destroy(s.SessionID)
+ dto.WriteDto(w, r, &dto.ErrorResponse{
+ Code: http.StatusForbidden,
+ Message: "Invalid session",
+ })
+ return
}
- }
- return err
- }
+ return
+ }
- c.Locals("uid", uid)
- c.Locals("username", fetchedUser.Username)
+ ctx := context.WithValue(r.Context(), "session", s)
- return c.Next()
+ next(w, r.WithContext(ctx))
+ }
}
}