Tmavý režim
Brána aplikace (skrytí SPA před nepřihlášenými)
SPA aplikace se dřív servírovala veřejně: kdokoli si mohl stáhnout index.html a všechny JS chunky a z nich vyčíst strukturu aplikace (routy, stránky, API). Lazy loading to neřeší — hlavní chunk obsahuje názvy všech chunků.
Řešení má dvě části:
- Samostatná přihlašovací stránka
login.html(pluginatreaLoginPage()zatrea-ui-layout-lib) — samostatný build bez Vue routeru a bez kódu aplikace. - Serverová brána — Caddy
forward_authnauser-api /gate/verify. Bez platné session dostane návštěvník jen/login.html,/login-assets/*a favicon. Nic jiného.
prohlížeč ──▶ Caddy ──forward_auth──▶ user-api /gate/verify
│ (HttpOnly cookie vázaná na host + přístup k instanci)
├─ 302 /login.html (nepřihlášený, navigace)
├─ 401 (nepřihlášený, asset)
└─ file_server / app (přihlášený s přístupem)Tok přihlášení
GET /bez session →302 /login.html?next=/…login.html→ OIDC (PKCE) přes ZITADEL, callback na/login.html(ZITADEL redirect URI se pro každou web instanci registruje automaticky).login.htmlpošle access token naPOST /_atrea/session→ user-api ověří token (musí být vydán pro OIDC klienta této aplikace), přístup k instanci, a nastaví cookie__Host-atrea_gate(HttpOnly, Secure, SameSite=Lax, vázaná na host).- Přesměrování na
next. SPA najde uživatele vsessionStorage(stejný klíč jakooidc-client-ts). - SPA obnovuje cookie při každém obnovení tokenu; odhlášení volá
POST /_atrea/logout.
Přístup se znovu vyhodnocuje u každého požadavku (cache 30 s) — odebrání role zamkne aplikaci i otevřeným uživatelům. Pravidlo přístupu je stejné jako u MCP konektoru.
Nasazení webu za bránu
- user-api: nastavit
APP_GATE_SECRET(openssl rand -base64 48). - Aplikace: přidat
atreaLoginPage()dovite.config.ts(viz READMEatrea-ui-layout-lib). - Caddy: použít snippet
deploy/Caddyfile.app-gate:
caddy
manager.amotion.cloud {
import atrea_gate atrea-user-api:3001
handle {
route {
import atrea_gate_check atrea-user-api:3001
root * /srv/manager/latest
try_files {path} /index.html
file_server
}
}
}route je nutný — jinak Caddy spustí try_files dřív než forward_auth.
Aplikace s legacy přihlášením
Brána ověřuje jen OIDC tokeny ze ZITADEL. aManager s legacy přihlášením (am-space) za bránu nasaďte až po jeho vypnutí.
Endpointy
| Cesta (přes Caddy) | user-api | Účel |
|---|---|---|
forward_auth | GET /gate/verify | 200 / 302 na login / 401 |
POST /_atrea/session | POST /gate/session | access token → cookie |
GET /_atrea/session | GET /gate/session | stav session pro login stránku |
POST /_atrea/logout | POST /gate/logout | smaže cookie |