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:
POST /auth/login- validace emailu
- rate limit na IP a IP+email
- dohledání uživatele přes
AuthService - ověření hesla přes Argon2ID
- u aktivního uživatele založení session
user
Logout maže:
userwebsite_csrf- pomocné session hodnoty
Passwordless login
Controller:
App\Modules\User\Auth\Passwordless\PasswordlessController
Service:
App\Modules\User\Auth\Passwordless\PasswordlessService
Flow:
POST /auth/request-loginneboPOST /auth/request-code- validace emailu a rate limit
- vytvoření:
OTPkódumagic linktokenu - poslání e-mailu s oběma možnostmi
- uživatel se přihlásí buď:
přes
POST /auth/verify-codenebo přesGET /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:
POST /auth/forgotten-password- validace emailu
- rate limit
- pokud uživatel existuje a je aktivní, pošle se reset e-mail
- 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:
POST /auth/change-password- validace tokenu a obou hesel
- kontrola délky hesla
- lookup tokenu v cache
- update hashovaného hesla do tabulky
user - smazání tokenu z cache
Registrace
Controller:
App\Modules\User\Auth\Registration\RegistrationController
Service:
App\Modules\User\Auth\Registration\RegistrationService
Flow:
POST /auth/registration- anti-spam kontrola přes
SpamChecker - rate limit
- validace dat
- vytvoření
Registereduživatele - odeslání mailu uživateli
- 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.tplpasswordless-login.tplforgotten-password.tplchange-password.tplregistration.tpl- odpovídající e-mailové šablony v
csaen
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