DexAuth
Identity Provider centrale della DexSuite — SSO, utenti, gruppi, audit
DexAuth è l'autenticatore centrale della DexSuite. Sa **chi sei** (autenticazione); le altre 4 app sanno **cosa puoi fare** (autorizzazione). La separazione netta delle responsabilità rende le altre app più snelle: DexHub, DexEditor, DexAssistant e Net Inventory Suite non ospitano più tabelle utenti — fanno solo verify HTTP a DexAuth e popolano `req.user` con utente + permessi.
Il flusso SSO è cookie-based: al login DexAuth setta `dexauth_sid` httpOnly + signed (HMAC con `SESSION_SECRET`) + `SameSite=Lax`. Hostname-only, così il browser lo manda automaticamente a tutte le porte dello stesso host. Quando un utente apre una qualsiasi delle 4 app, il middleware SSO fa `GET /api/whoami` su DexAuth, ottiene user/permessi, fa JIT provisioning e l'utente è dentro. Single Sign-Out: clic su "Esci" da una qualsiasi app → DexAuth distrugge la sessione globale → al prossimo refresh tutte le altre app riconoscono il logout e chiudono le sessioni locali.
Provider di autenticazione pluggable: `local` (funzionante, bcrypt + DB), `ldap` (skeleton, attivabile compilando `LDAP_URL` + `LDAP_BIND_DN` e installando `ldapjs`), `oidc` (skeleton, per Azure AD / Google / Keycloak / Authentik via `openid-client`). Il factory carica i provider configurati e ordinati per priorità.
Gestione utenti completa via UI standalone: utenti (con `must_change_password` al primo login), gruppi (membri + permessi ereditati), permessi DexAuth-livello-superiore (`user.read`, `user.write`, `user.password_reset`, `audit.read`, `provider.write`) separati da quelli applicativi delle 4 app. Reset password genera password temporanea + forza cambio. Sessioni attive monitorabili e killabili dall'admin (con clear cookie server-side se l'admin termina la propria sessione).
Audit ledger su tabella `audit_events` + mirror su file `data/logs/dexauth-audit.log` (linea JSON, parser-friendly per audit log centralizzato). Action keys stabili e namespacate: `auth.login.success`, `auth.login.failed`, `auth.password.changed`, `user.created`, `group.permissions_set`, `session.killed`, ecc.
UI bilingue IT (default) + EN, switch persistente in `localStorage`, chatbot embedded come nelle altre app (proxy verso Dex Assistant + tool dedicati `dexauth__get_user_status`).
Funzionalità
- Single Sign-On cookie-based per le 4 app DexSuite (NIS, DexHub, DexEditor, DexAssistant)
- Single Sign-Out: logout da una qualsiasi app chiude la sessione globale
- Provider auth pluggable: local (bcrypt) ✅, LDAP/AD 🟡 skeleton, OIDC 🟡 skeleton
- Cookie httpOnly + signed (HMAC con SESSION_SECRET) + SameSite=Lax
- Client SSO pronti: middleware Express per Node, decorator Flask per Python
- Whoami con cache TTL 30s lato client, invalidazione automatica su 401
- JIT provisioning: la prima volta che un utente DexAuth appare in un'app, riga locale auto-creata
- CRUD utenti con must_change_password al primo login + reset password admin
- CRUD gruppi con membri e permessi ereditati
- Permessi DexAuth-level: user.read/write, user.password_reset, audit.read, provider.write
- Sessioni attive monitorabili dall'admin con bottone "Killa" + clear cookie server-side
- Audit ledger: tabella audit_events + mirror file JSON line per log centralizzato
- Action keys namespacate stabili (auth.login.success, user.created, ecc.)
- Multilingua IT (default) + EN, switch persistente in localStorage
- Chatbot embedded (FAB) con tool dedicati (dexauth__get_user_status)
- HTTPS con certificato (TLS) per accesso sicuro a UI e API
- UI responsive: mobile / tablet / desktop
Parametrizzazioni
- DEXAUTH_PORT (default 9000)
- DEXAUTH_HOST (default 0.0.0.0 — bind LAN richiesto per il pattern SSO della suite)
- SESSION_SECRET — stringa per firmare i cookie. Da cambiare in produzione.
- SESSION_TTL_MINUTES (default 720, ovvero 12h)
- SESSION_COOKIE_DOMAIN (vuoto per cookie hostname-only — consigliato)
- DB_ENGINE: sqlite | postgres | mariadb
- DEXAUTH_DB_PATH (default data/dexauth.db)
- INITIAL_ADMIN_PASSWORD — bootstrap admin (se vuota → admin/admin con must_change=true)
- DEXAUTH_DEFAULT_LOCALE (it | en, default it)
- DEXAUTH_AUDIT_PATH (default data/logs/dexauth-audit.log)
- DEXASSISTANT_URL — per il chat widget embedded
- LDAP_URL / LDAP_BIND_DN — per attivare provider LDAP
- OIDC_ISSUER / OIDC_CLIENT_ID — per attivare provider OIDC
- HTTPS_PFX / HTTPS_PFX_PASSWORD per abilitare TLS
Pre-requisiti tecnici
- Node.js 18+
- DB SQL: SQLite (incluso) oppure PostgreSQL 14+ / MariaDB 10.6+
- Stesso schema HTTP/HTTPS delle 4 app downstream (Chrome Schemeful Same-Site non manda il cookie cross-scheme)
- Tutte le 5 app sullo stesso hostname (porte diverse OK)
- Per LDAP/AD: dipendenza npm ldapjs + env LDAP_URL/LDAP_BIND_DN
- Per OIDC: dipendenza npm openid-client + env OIDC_ISSUER/OIDC_CLIENT_ID
- Dex Assistant raggiungibile (opzionale, per chatbot embedded)