Skip to main content
Az API a helyi Gewiss Gatepass szervernek ad hozzáférést a rögzített, importálásra váró dolgozói adatokhoz. Minden végpont 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

A tokent a 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.
A JWT visszavonás nincs beépítve. Ha egy tokent kompromittáltnak gyanítasz, a felhasználó jelszavának cseréje nem érvényteleníti a már kiadott, még le nem járt tokeneket. Tarts rövid TTL-t, és szükség esetén vezess be külön token blacklistet.

2. Token használata

Minden védett végpont Authorization: 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éskor 429 Too many requests, és minden válasz tartalmazza az X-RateLimit-Limit / X-RateLimit-Remaining fejlé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 kapnak Access-Control-Allow-* fejléceket; OPTIONS preflight kérésre a middleware 204-gyel zár, mielőtt bármi más lefutna.