Content-Type: application/json választ ad, és a CorsMiddleware + RateLimitMiddleware páron megy keresztül, a védett végpontok pedig ApiAuthMiddleware-en is.
Autentikáció
1. Token igénylése
JwtService::issue() állítja ki: HS256, iss/aud/iat/nbf/exp/sub (felhasználó ID)/jti claimekkel, a security.jwt_secret titokkal aláírva. Az élettartam a JWT_TTL (.env) alapján állítható, alapértelmezetten 3600 mp.
2. Token használata
Minden védett végpontAuthorization: Bearer <token> fejlécet vár (Request::bearerToken() a ^Bearer\s+(\S+)$ mintát illeszti). Az ApiAuthMiddleware dekódolja a JWT-t, ellenőrzi, hogy a sub claimhez tartozó felhasználó még létezik-e, és a felhasználó ID-t a $_SERVER['API_USER_ID'] kulcsban teszi elérhetővé a controllernek. Érvénytelen/lejárt token vagy törölt felhasználó esetén 401.
Végpontok
GET /api/me
A tokenhez tartozó felhasználó adatai (id, name, email, phone, role, created_at).
GET /api/employees
Az összes importálásra váró (imported_at IS NULL) dolgozó, létrehozási sorrendben. A photo/avatar relatív tárolási útvonalak helyett teljes, letölthető URL-t ad vissza (ApiController::fileUrl), ami a /api/employees/file?path=... végpontra mutat.
Ez a végpont nincs a hívó felhasználó
accessScope-jához igazítva — minden importálásra váró dolgozót visszaad, függetlenül attól, hogy melyik felhasználó rögzítette. A scope-szűrés csak a webes felületen (EmployeeController::index) érvényesül. Ha a Gatepass integrációnak felhasználónkénti szűrésre is szüksége lenne, ezt itt még be kell vezetni.GET /api/employees/file?path=<fájlnév>
Egy korábban visszakapott photo/avatar URL-ből kinyert fájlnevet (nem teljes útvonalat) vár a path paraméterben. A controller basename()-mel és realpath()-os prefix-ellenőrzéssel zárja ki a könyvtár-bejárásos (../) próbálkozásokat, mielőtt a storage/uploads/employees/ alól kiszolgálná a fájlt. .png kiterjesztésnél image/png, egyébként image/jpeg content type.
POST /api/employees/ack
A Gatepass szerver ezzel jelzi vissza, hogy mely dolgozókat importálta sikeresen — ezek után a rekordok imported_at mezője beállításra kerül, és a webes felületen szerkeszthetetlenné válnak.
A visszaadott
updated szám az elküldött ID-k száma, nem a ténylegesen módosított sorok száma — nem létező vagy már importált ID-k csendben figyelmen kívül maradnak az UPDATE ... WHERE id IN (...) lekérdezésben, de a válasz szám ettől nem csökken.Tipikus integrációs folyamat
Rate limit és CORS
- Rate limit: fájlalapú számláló IP + útvonal + időablak kulccsal (
storage/cache/rl_*), alapértelmezetten 60 kérés / 60 mp (RATE_LIMIT_MAX,RATE_LIMIT_WINDOW). Túllépéskor429 Too many requests, és minden válasz tartalmazza azX-RateLimit-Limit/X-RateLimit-Remainingfejléceket. Ez egygépes megoldás — több PHP-FPM/webszerver példány esetén nem konzisztens, Redis-alapú limiter javasolt helyette. - CORS: csak a
CORS_ALLOWED_ORIGINS(.env, vesszővel elválasztott lista) között szereplő originek kapnakAccess-Control-Allow-*fejléceket;OPTIONSpreflight kérésre a middleware204-gyel zár, mielőtt bármi más lefutna.