Skip to content

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:

  1. Samostatná přihlašovací stránka login.html (plugin atreaLoginPage() z atrea-ui-layout-lib) — samostatný build bez Vue routeru a bez kódu aplikace.
  2. Serverová brána — Caddy forward_auth na user-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í ​

  1. GET / bez session → 302 /login.html?next=/…
  2. login.html → OIDC (PKCE) přes ZITADEL, callback na /login.html (ZITADEL redirect URI se pro každou web instanci registruje automaticky).
  3. login.html pošle access token na POST /_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).
  4. Přesměrování na next. SPA najde uživatele v sessionStorage (stejný klíč jako oidc-client-ts).
  5. 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 ​

  1. user-api: nastavit APP_GATE_SECRET (openssl rand -base64 48).
  2. Aplikace: přidat atreaLoginPage() do vite.config.ts (viz README atrea-ui-layout-lib).
  3. 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_authGET /gate/verify200 / 302 na login / 401
POST /_atrea/sessionPOST /gate/sessionaccess token → cookie
GET /_atrea/sessionGET /gate/sessionstav session pro login stránku
POST /_atrea/logoutPOST /gate/logoutsmaže cookie

Atrea User API — interní dokumentace