Teljes rendszerterv: architektúra, folyamatábrák, biztonsági rétegek, GDPR megfelelőség és fejlesztési ütemterv
A rendszer célja, hogy a fesztiválon tartózkodó látogatók QR kód beolvasásával gyorsan, egyszerűen tudjanak ételt rendelni a két partner standjától, futáros kiszállítással, helyszíni fizetéssel (POS terminál). Nincs bejelentkezés, nincs GPS, nincs online fizetés.
Kint elhelyezett kódok irányítják a látogatót. Nincs letöltendő app, böngészőből fut.
Menüválasztás, kosár összeállítás, standszám + e-mail megadása. Semmi más adat.
Időkorlátolt link (15 perc). Megerősítés után a rendelés aktívvá válik és generálódik a rendelési szám.
A futár a megadott standhoz viszi a rendelést, ott fizet a vendég POS terminállal.
Többrétegű védelem az egyszer használatos e-mail spam ellen. Részletek a 4. fejezetben.
Valós idejű rendelés-lista, státuszkezelés, manuális tiltás lehetősége.
Négy szereplő vesz részt a rendszer működésében. Bejelentkezés csak az admin és futár szerepköröknél szükséges.
| Szerepkör | Ki? | Hozzáférés | Azonosítás |
|---|---|---|---|
| Vendég | Fesztiválon tartózkodó látogató | QR → partnerválasztás → menü → kosár → rendelés leadás → e-mail megerősítés → rendelési szám megtekintés | E-mail + standkód |
| Partner Admin | A két étterem/stand üzemeltetője | Saját rendeléseik valós idejű listája · Rendelési státusz frissítés (Folyamatban / Kész / Kiszállítva) · Menü árak és tételek szerkesztése · Saját standjához futárokat felvehet / eltávolíthat | Google OAuth |
| Futár | A kiszállítást végző kollégák | Aktív, visszaigazolt rendelések megtekintése · Kiszállítás megjelölése · Standszám és rendelési szám látható · Felveheti: Rendszergazda (bármelyik standhoz) vagy Partner Admin (csak saját standjához) | Google OAuth |
| Rendszergazda | fejlesztő / üzemeltető | Teljes hozzáférés · Partner Adminok felvétele / eltávolítása · Futárok felvétele bármelyik standhoz · Rendelések törlése/tiltása · E-mail domain blacklist · Monitoring · Standkód lista szerkesztése | Google OAuth |
Nincs jelszókezelés, nincs jelszó reset flow, nincs „elfelejtett jelszó" email. A Rendszergazda meghívja a Partner Admin Google-fiókját, az egy kattintással bejelentkezik. A jogosultságok az adatbázisban tárolódnak (user_id → role + partner_id). Ha valaki kilép, egy törlés az adatbázisban azonnal megvonja a hozzáférést.
A legfőbb fenyegetés: valaki egyszer használatos (10minutemail, guerrilla mail, stb.) e-mail fiókokat generál, rendeléseket ad le tömegesen ugyanarra a standra, visszaigazolja őket, és lekötözi a futárokat és a konyhát. Az alábbiakban 7 egymást erősítő védelmi réteget ismertetünk.
ratelimit:ip:{ip_hash}:{window}.RandomNumberGenerator.GetBytes(32) vagy Guid.NewGuid()./confirm?t=TOKEN), nem az alkalmazás főoldalára — megakadályozza a social engineering-et.| Fenyegetés | Védelem | Hatékonyság |
|---|---|---|
| Ismert temp-mail domainről rendelés | Domain blacklist (réteg 1) | Magas (~80%) |
| Ismeretlen új temp-mail domainről | E-mail limit/cooldown (réteg 3) + standkorlát (réteg 4) | Magas |
| Tömeges automatizált rendelés (bot) | IP rate limit (réteg 2) + Honeypot (réteg 6) | Nagyon magas |
| Manuális spam (emberi) | Cooldown (réteg 3) + standkorlát (réteg 4) + monitoring (réteg 7) | Közepes-magas |
| Token újrahasználat | Egyszeri token + 15 perc lejárat (réteg 5) | Teljes |
A fesztiválon fizikailag ott kell lenni a QR kódhoz, a standkódhoz. Komoly, célzott támadás esetén (ami egy 4 napos gourmet feszten nem valószínű) az admin manuális beavatkozása mindig opció. A cél: a rendszer ne legyen triviálisan megtámadható, és legyen emberi felügyeleti lehetőség valós időben.
A rendszer egyetlen személyes adatot gyűjt: az e-mail címet. Ez megfelelő adatvédelmi intézkedésekkel kezelhető minimális komplexitással.
A stack alapelve: ismert, kontrollált saját infrastruktúra, konténerizált futtatás, egyértelműen szétválasztott felelősségi körök. Nincs külső SaaS függőség az éles futtatáshoz.
A Google OAuth flow: felhasználó bejelentkezik Google-lel → a backend ellenőrzi, hogy a Google sub (user ID) szerepel-e az app_users táblában és milyen szerepköre van → ha nincs bejegyezve, hozzáférés megtagadva. Így csak előre felvett személyek léphetnek be.
Visszaigazoló emailek küldése a .NET backend MailKit könyvtárán keresztül. Az email sablon HTML alapú, mobilon olvasható, minimális tartalom (token link + rendelési összesítő).
| Tábla | Kulcs mezők | Megjegyzés |
|---|---|---|
| app_users | id, google_sub, email, role (enum), partner_id (nullable), created_by, created_at, is_active | Google OAuth azonosítóval kötött felhasználó. partner_id null = Rendszergazda. EF Core HasConversion a role enumhoz. |
| partners | id, name, description, logo_url, delivery_fee, is_active | A két partner stand adatai — admin szerkeszthető |
| orders | id, partner_id, stand_code_id, email_hash, email_encrypted, status (enum), order_number, confirmation_token, token_expires_at, total_price, created_at | Email kétféleképpen: hash (kereséshez/limithez), titkosítva (email küldéshez, AES-256). Token GUID, index: status + created_at. |
| order_items | id, order_id, menu_item_id, quantity, unit_price_snapshot | Árat snapshotolni kell (ne változzon utólag ha az admin módosít) |
| menu_items | id, partner_id, name, description, price, image_url, is_available, display_order | Partner Admin szerkesztheti valós időben, soft delete |
| stand_codes | id, code, label, is_active, active_order_count (computed/cached) | Érvényes standkódok listája — egyedi index a code oszlopra |
| blocked_domains | id, domain, added_at, added_by_user_id | Admin által szerkeszthető blacklist, FK az app_users-re |
| audit_log | id, event_type, ip_hash, email_hash, user_id (nullable), details (jsonb), created_at | GDPR-kompatibilis napló. Szöveges e-mail NEM kerül ide. details JSONB = rugalmas esemény adatok. |
Az esemény dátuma: 2025. június 4. Az alábbi ütemterv ~10 hetes fejlesztési ablakot feltételez. Priorizált: vendég felület → biztonsági logika → admin panel → tesztelés.
Biztonsági rétegek (6. hét): Ha ez csúszik, az esemény biztonsági kockázatot jelent. Prioritás #1. | Google Cloud Console setup (1. hét): OAuth app regisztráció + authorized redirect URI-k beállítása — ez engedélyezési folyamat, akár napokat vehet igénybe! | Menütartalom (partnerektől): Legalább 3 héttel az esemény előtt kell a végleges menü + fotók. | AhaSend / SMTP konfiguráció: Domain hitelesítés (SPF, DKIM) beállítása — 24–48 óra propagáció. Nem hagyható utoljára.
<Image> komponens: automatikus lazy loading, srcSet, AVIF/WebP konverziólocalStorage-ban cache-elve (amíg el nem küldi) — nem veszik el kapcsolatmegszakadáskoremail_hash, stand_code_id, status, created_at, confirmation_token