= Безбедност (Security) = == Што е имплементирано == * **Хеширање на лозинки (bcrypt):** при `/api/register-student` и `/api/register-instructor` се зачувува `*_password_hash` * **Login со JWT:** `/api/login` (type: "user" или "instructor", email, password). Одговор: `{token, role}` * **JWT аутентикација:** `/api/book-class` и `/api/register-event` читаат корисник од JWT ако е присутен, иначе користат `userId` од body * **HTTP безбедносни заглавија:** `helmet()`. * **Rate limit:** на `/api/login` и register рути. * **Побезбеден CORS:** дозволени origin-и од `.env` (`CORS_ORIGIN=http://localhost:3000`). * **Валидирање/санитизација:** базични проверки за email и должина на лозинка. == .env == {{{ JWT_SECRET=change_this_in_production CORS_ORIGIN=http://localhost:3000 RATE_LIMIT_WINDOW_MS=900000 RATE_LIMIT_MAX=50 PORT=5000 }}} == Тест сценарија == 1) Регистрација → лозинката се хешира. 2) Логирање: {{{ POST /api/login { "type":"user", "email":"ana@example.com", "password":"" } }}} Одговор: {{{json { "success": true, "token": "", "role": "user" } }}} 3) Користење на токен: - `Authorization: Bearer ` при POST `/api/book-class` со `{ "classId": 7 }`. == Забелешки == * Сите SQL повици се **параметризирани** (`$1,$2,...`) → заштита од SQL injection. * Преостанува: HTTPS, посебни secrets, поконкретни CORS правила и валидирање, и по можност серверска сесија/рефреш токени.