[DEMO] Auto-auth SPA demo: demo_jwt nel fragment spa_iframe_url + bootstrap token sincrono in common-bi.js
Chiude il gap auth: la SPA demo si auto-autentica col demo_jwt (token API nis2_access_token + org dal payload) PRIMA di checkAuth, cross-origin (niente sessionStorage same-origin). spa_iframe_url ora atterra su /dashboard.html?demo=..#djwt=... DemoController.DEMO_BASE override via env DEMO_BASE_URL (switch a sottodominio senza codice). USR2 richiesto per DemoController.
This commit is contained in:
@@ -66,9 +66,12 @@ class DemoController extends BaseController
|
|||||||
'demo_jwt' => $demoJwt,
|
'demo_jwt' => $demoJwt,
|
||||||
'company_id' => $orgId, // alias di compatibilità standard
|
'company_id' => $orgId, // alias di compatibilità standard
|
||||||
'organization_id' => $orgId,
|
'organization_id' => $orgId,
|
||||||
'spa_iframe_url' => self::DEMO_BASE . '/?demo=' . $sessionId,
|
// spa_iframe_url atterra su dashboard e porta il demo_jwt nel FRAGMENT (#djwt):
|
||||||
'manifest_url' => self::DEMO_BASE . '/api/demo/manifest?session_id=' . $sessionId,
|
// common-bi.js lo imposta come token API in modo SINCRONO (prima di checkAuth),
|
||||||
'credentials_url' => self::DEMO_BASE . '/api/demo/credentials?session_id=' . $sessionId,
|
// così la SPA si auto-autentica anche cross-origin (niente sessionStorage same-origin).
|
||||||
|
'spa_iframe_url' => $this->demoBase() . '/dashboard.html?demo=' . $sessionId . '#djwt=' . $demoJwt,
|
||||||
|
'manifest_url' => $this->demoBase() . '/api/demo/manifest?session_id=' . $sessionId,
|
||||||
|
'credentials_url' => $this->demoBase() . '/api/demo/credentials?session_id=' . $sessionId,
|
||||||
'expires_at' => gmdate('Y-m-d\TH:i:s\Z', $expiresTs),
|
'expires_at' => gmdate('Y-m-d\TH:i:s\Z', $expiresTs),
|
||||||
'hmac_key_seed' => $hmacKeySeed,
|
'hmac_key_seed' => $hmacKeySeed,
|
||||||
'presentation_mode' => 'realtime',
|
'presentation_mode' => 'realtime',
|
||||||
@@ -200,6 +203,15 @@ class DemoController extends BaseController
|
|||||||
|
|
||||||
// ═══ Helpers ═════════════════════════════════════════════════════════════
|
// ═══ Helpers ═════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
|
/** Base URL della SPA demo (override via env DEMO_BASE_URL per switch a sottodominio). */
|
||||||
|
private function demoBase(): string
|
||||||
|
{
|
||||||
|
return getenv('DEMO_BASE_URL')
|
||||||
|
?: ($_SERVER['DEMO_BASE_URL'] ?? '')
|
||||||
|
?: ($_ENV['DEMO_BASE_URL'] ?? '')
|
||||||
|
?: self::DEMO_BASE;
|
||||||
|
}
|
||||||
|
|
||||||
/** Risolve la sessione da Bearer demo_jwt (preferito) o ?session_id=. */
|
/** Risolve la sessione da Bearer demo_jwt (preferito) o ?session_id=. */
|
||||||
private function resolveSession(): ?array
|
private function resolveSession(): ?array
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -176,6 +176,21 @@
|
|||||||
(function () {
|
(function () {
|
||||||
try {
|
try {
|
||||||
if (!new URLSearchParams(window.location.search).get('demo')) return;
|
if (!new URLSearchParams(window.location.search).get('demo')) return;
|
||||||
|
// Auto-auth SINCRONA: il demo_jwt arriva nel fragment (#djwt=) dello spa_iframe_url.
|
||||||
|
// Lo impostiamo come token API PRIMA che la pagina chiami checkAuth() (common-bi.js gira
|
||||||
|
// prima dello script inline della pagina). Origin demo separato → nessuna pollution di sessioni reali.
|
||||||
|
try {
|
||||||
|
var h = new URLSearchParams((window.location.hash || '').replace(/^#/, ''));
|
||||||
|
var djwt = h.get('djwt');
|
||||||
|
if (djwt && !localStorage.getItem('nis2_access_token')) {
|
||||||
|
localStorage.setItem('nis2_access_token', djwt);
|
||||||
|
localStorage.setItem('nis2_user_role', 'compliance_manager');
|
||||||
|
try {
|
||||||
|
var pl = JSON.parse(atob(djwt.split('.')[1].replace(/-/g, '+').replace(/_/g, '/')));
|
||||||
|
if (pl && pl.org_id) localStorage.setItem('nis2_org_id', String(pl.org_id));
|
||||||
|
} catch (e2) { /* jwt opaco: org via credentials */ }
|
||||||
|
}
|
||||||
|
} catch (e1) { /* noop */ }
|
||||||
var css = document.createElement('link'); css.rel = 'stylesheet'; css.href = '/css/demo.css'; document.head.appendChild(css);
|
var css = document.createElement('link'); css.rel = 'stylesheet'; css.href = '/css/demo.css'; document.head.appendChild(css);
|
||||||
var inject = function () {
|
var inject = function () {
|
||||||
var s1 = document.createElement('script'); s1.src = '/js/demo-selectors.js';
|
var s1 = document.createElement('script'); s1.src = '/js/demo-selectors.js';
|
||||||
|
|||||||
Reference in New Issue
Block a user