| | 1 | = Безбедност (Security) = |
| | 2 | |
| | 3 | |
| | 4 | == Што е имплементирано == |
| | 5 | * **Хеширање на лозинки (bcrypt):** при `/api/register-student` и `/api/register-instructor` се зачувува `*_password_hash` |
| | 6 | * **Login со JWT:** `/api/login` (type: "user" или "instructor", email, password). Одговор: `{token, role}` |
| | 7 | * **JWT аутентикација:** `/api/book-class` и `/api/register-event` читаат корисник од JWT ако е присутен, иначе користат `userId` од body |
| | 8 | * **HTTP безбедносни заглавија:** `helmet()`. |
| | 9 | * **Rate limit:** на `/api/login` и register рути. |
| | 10 | * **Побезбеден CORS:** дозволени origin-и од `.env` (`CORS_ORIGIN=http://localhost:3000`). |
| | 11 | * **Валидирање/санитизација:** базични проверки за email и должина на лозинка. |
| | 12 | |
| | 13 | == .env == |
| | 14 | {{{ |
| | 15 | JWT_SECRET=change_this_in_production |
| | 16 | CORS_ORIGIN=http://localhost:3000 |
| | 17 | RATE_LIMIT_WINDOW_MS=900000 |
| | 18 | RATE_LIMIT_MAX=50 |
| | 19 | PORT=5000 |
| | 20 | }}} |
| | 21 | |
| | 22 | == Тест сценарија == |
| | 23 | 1) Регистрација → лозинката се хешира. |
| | 24 | 2) Логирање: |
| | 25 | {{{ |
| | 26 | POST /api/login |
| | 27 | { "type":"user", "email":"ana@example.com", "password":"<lozinka>" } |
| | 28 | }}} |
| | 29 | Одговор: |
| | 30 | {{{json |
| | 31 | { "success": true, "token": "<JWT>", "role": "user" } |
| | 32 | }}} |
| | 33 | 3) Користење на токен: |
| | 34 | - `Authorization: Bearer <JWT>` при POST `/api/book-class` со `{ "classId": 7 }`. |
| | 35 | |
| | 36 | == Забелешки == |
| | 37 | * Сите SQL повици се **параметризирани** (`$1,$2,...`) → заштита од SQL injection. |
| | 38 | * Преостанува: HTTPS, посебни secrets, поконкретни CORS правила и валидирање, и по можност серверска сесија/рефреш токени. |