Skip to main content
API používá session-based autentizaci přes cookies. Není to typický stateless REST — v requestu posíláte session cookie a server identitu odvodí z PHP session. Po úspěšném loginu vám server nastaví cookie:
  • Jméno: standardní PHP session (typicky PHPSESSID).
  • Doména: scope portálu.
  • HttpOnly: ano (JS nemůže číst).
  • Secure: ano v produkci (HTTPS only).
V dalších requestech browser cookie posílá automaticky. Pro externí klienty (curl, Postman) si cookie uložte z přihlašovacího requestu a posílejte ji v hlavičce Cookie.

Přihlášení

POST /api/v1/auth/login HTTP/1.1
Content-Type: application/json

{
  "username": "pepa",
  "password": "supersecret"
}

Bez 2FA

{
  "status": "ok",
  "data": {
    "logged_in": true,
    "user_id": "8b...",
    "username": "pepa"
  }
}
Server zároveň pošle session cookie.

S 2FA

{
  "status": "ok",
  "data": {
    "challenge": true,
    "challenge_token": "9c...."
  }
}
Volajte následně:
POST /api/v1/auth/challenge HTTP/1.1
Content-Type: application/json

{
  "challenge_token": "9c...",
  "code": "482910"
}
Po úspěchu vznikne session.

OAuth flow

1. GET /api/v1/auth/providers/discord?action=login
   → 302 na Discord
2. Uživatel na Discordu autorizuje
3. Discord callback: /api/v1/auth/providers/discord?action=callback&code=...
4. Server vymění code za token, načte profil, vytvoří/loginuje session
5. Redirect na portál (přihlášený uživatel)
Pro link existujícího účtu:
GET /api/v1/auth/providers/discord?action=link
Předpoklad: jste už přihlášení.

Status check

GET /api/v1/auth/status
Vrátí stav session bez chyby (i pro nepřihlášené):
{ "status": "ok", "data": { "logged_in": true, "user_id": "...", "username": "...", "role": ["USER"] } }

Logout

POST /api/v1/auth/logout
Smaže session, server pošle cookie s Max-Age=0.

Tokeny pro recovery / activation / email change

Tabulka sys_tokens obsahuje krátkodobé tokeny:
TypeÚčelExpirace
TYPE_ACTIVATIONAktivace nového účtu24 h
TYPE_RECOVERYReset hesla24 h
TYPE_CHALLENGE2FA challenge30 min
TYPE_INTEGRATION_DISCORDKonfirmace propojeníkrátká
TYPE_INTEGRATION_STEAMKonfirmace propojeníkrátká
TYPE_EMAIL_CHANGEPotvrzení změny e-mailu24 h
Endpointy je konzumují podle typu (např. POST /api/v1/auth/activate pro TYPE_ACTIVATION).

Kontrola role

V controlleru:
if (!Auth::isInRoles([Roles::ADMIN])) {
    throw new ForbiddenException();
}
Roli vrací Auth::getCurrentUserId() v kombinaci s GroupFacade::getUserGroups($id).