package middleware import ( "codeword/internal/models" "fmt" "strings" "github.com/gofiber/fiber/v2" ) const ( prefix = "Bearer " ) func NewAuthenticator(jwtUtil *JWT) func(*fiber.Ctx) error { return func(c *fiber.Ctx) error { if jwtUtil == nil { return fmt.Errorf("jwt util is nil") } if err := authenticate(c, jwtUtil); err != nil { return fmt.Errorf("authentication error:%d", err) } return c.Next() } } func authenticate(c *fiber.Ctx, jwtUtil *JWT) error { authHeader := c.Get("Authorization") if authHeader == "" || !strings.HasPrefix(authHeader, prefix) { return fmt.Errorf("failed to parse jws from request header: %s", authHeader) } jws := strings.TrimPrefix(authHeader, prefix) userID, validateErr := jwtUtil.Validate(jws) if validateErr != nil { return validateErr } c.Locals(models.AuthJWTDecodedUserIDKey, userID) c.Locals(models.AuthJWTDecodedAccessTokenKey, jws) return nil } func ExtractUserID(c *fiber.Ctx) string { userID := c.Context().UserValue(models.AuthJWTDecodedUserIDKey).(string) return userID }