Skip to content

Website Auth

Website auth je samostatná vrstva oproti admin passkey auth. Běží v app/Modules/User/Auth/* a routuje se přes app/routes/website.php.

Co umí

  • klasický login emailem a heslem
  • passwordless login přes e-mailový kód a magic link
  • forgotten password
  • změnu hesla přes reset token
  • registraci uživatele
  • schválení registrace administrátorem
  • logout

Routy

V app/routes/website.php jsou dnes aktivní hlavně tyto endpointy:

Metoda Route Účel
POST /auth/login klasický login
POST /auth/logout logout
POST /auth/request-login passwordless start
POST /auth/request-code alias passwordless start
POST /auth/verify-code ověření 6místného kódu
GET /auth/magic-login login přes magic link
POST /auth/forgotten-password poslání reset mailu
POST /auth/change-password změna hesla
POST /auth/registration registrace
GET /auth/approve-registration schválení registrace

Render stránek samotných jde přes slug routy typu:

  • /auth/login
  • /auth/forgotten-password
  • /auth/registration
  • /auth/change-password/{token}

Klasický login

Controller:

  • App\Modules\User\Auth\AuthController

Flow:

  1. POST /auth/login
  2. validace emailu
  3. rate limit na IP a IP+email
  4. dohledání uživatele přes AuthService
  5. ověření hesla přes Argon2ID
  6. u aktivního uživatele založení session user

Logout maže:

  • user
  • website_csrf
  • pomocné session hodnoty

Passwordless login

Controller:

  • App\Modules\User\Auth\Passwordless\PasswordlessController

Service:

  • App\Modules\User\Auth\Passwordless\PasswordlessService

Flow:

  1. POST /auth/request-login nebo POST /auth/request-code
  2. validace emailu a rate limit
  3. vytvoření: OTP kódu magic link tokenu
  4. poslání e-mailu s oběma možnostmi
  5. uživatel se přihlásí buď: přes POST /auth/verify-code nebo přes GET /auth/magic-login

Detaily:

  • OTP je 6místný
  • magic link i OTP expirují za 15 minut
  • obě varianty se ukládají do user_auth_codes
  • hashe se ukládají přes Argon2ID

Forgotten password

Controller:

  • App\Modules\User\Auth\ForgottenPassword\ForgottenPasswordController

Service:

  • App\Modules\User\Auth\ForgottenPassword\ForgottenPasswordService

Flow:

  1. POST /auth/forgotten-password
  2. validace emailu
  3. rate limit
  4. pokud uživatel existuje a je aktivní, pošle se reset e-mail
  5. token se uloží do cache pod klíčem change-password/<token>

Reset link vede na:

  • /auth/change-password/{token}

Token expiruje za 15 minut.

Změna hesla

Controller:

  • App\Modules\User\Auth\ChangePassword\ChangePasswordController

Flow:

  1. POST /auth/change-password
  2. validace tokenu a obou hesel
  3. kontrola délky hesla
  4. lookup tokenu v cache
  5. update hashovaného hesla do tabulky user
  6. smazání tokenu z cache

Registrace

Controller:

  • App\Modules\User\Auth\Registration\RegistrationController

Service:

  • App\Modules\User\Auth\Registration\RegistrationService

Flow:

  1. POST /auth/registration
  2. anti-spam kontrola přes SpamChecker
  3. rate limit
  4. validace dat
  5. vytvoření Registered uživatele
  6. odeslání mailu uživateli
  7. odeslání mailu administrátorovi s approval odkazem

Pokud je CONFIG['userAuthMethod'] === 'passwordless', registrace nevynucuje heslo.

Schválení registrace

Admin approval probíhá přes:

  • GET /auth/approve-registration?id=...&token=...

Service ověří jednorázový token v user_auth_codes a změní status z Registered na Active.

Po schválení se uživateli pošle potvrzovací e-mail.

Šablony

Website auth šablony jsou v:

  • app/Modules/User/Auth/templates/

Patří sem například:

  • password-login.tpl
  • passwordless-login.tpl
  • forgotten-password.tpl
  • change-password.tpl
  • registration.tpl
  • odpovídající e-mailové šablony v cs a en

Bezpečnostní poznámky

  • login a reset endpointy mají rate limit
  • hashování používá Argon2ID
  • timing attack mitigace je řešená i při neexistujícím uživateli
  • passwordless kódy i magic linky jsou jednorázové
  • reset tokeny jsou krátkodobé a ukládané v cache