diff --git a/index.html b/index.html index 3e8c576..31716ea 100644 --- a/index.html +++ b/index.html @@ -753,10 +753,35 @@ return pathname; } + function buildAuthConfigBase() { + const cfg = window.AUTH_CONFIG && typeof window.AUTH_CONFIG === "object" ? window.AUTH_CONFIG : {}; + const auth0 = cfg.auth0 && typeof cfg.auth0 === "object" ? cfg.auth0 : {}; + const connections = cfg.connections && typeof cfg.connections === "object" ? cfg.connections : {}; + const adminEmails = Array.isArray(cfg.adminEmails) + ? cfg.adminEmails + : Array.isArray(cfg.allowedEmails) + ? cfg.allowedEmails + : []; + return { + auth0: { + domain: String(auth0.domain || "").trim(), + clientId: String(auth0.clientId || "").trim(), + }, + connections: { + google: String(connections.google || "").trim(), + kakao: String(connections.kakao || "").trim(), + naver: String(connections.naver || "").trim(), + }, + adminEmails: adminEmails.map((e) => String(e).trim().toLowerCase()).filter(Boolean), + }; + } + async function hydrateAuthConfigFromServerIfNeeded() { - const cfg = getAuthConfig(); - const hasLocal = Boolean(cfg.auth0.domain && cfg.auth0.clientId && cfg.connections.google); - if (hasLocal) return true; + const embedded = buildAuthConfigBase(); + const fullyInPage = Boolean( + embedded.auth0.domain && embedded.auth0.clientId && embedded.connections.google + ); + if (fullyInPage) return true; try { const r = await fetch(apiUrl("/api/config/auth"), { cache: "no-store" }); if (!r.ok) return false; @@ -765,6 +790,11 @@ const v = data.value; const auth0 = v.auth0 || {}; const connections = v.connections || {}; + const adminEmails = Array.isArray(v.adminEmails) + ? v.adminEmails + : Array.isArray(v.allowedEmails) + ? v.allowedEmails + : []; const domain = String(auth0.domain || "").trim(); const clientId = String(auth0.clientId || "").trim(); const google = String(connections.google || "").trim(); @@ -774,6 +804,7 @@ JSON.stringify({ auth0: { domain, clientId }, connections: { google }, + adminEmails: adminEmails.map((e) => String(e).trim().toLowerCase()).filter(Boolean), }) ); return true; @@ -817,27 +848,7 @@ } function getAuthConfig() { - const cfg = window.AUTH_CONFIG && typeof window.AUTH_CONFIG === "object" ? window.AUTH_CONFIG : {}; - const auth0 = cfg.auth0 && typeof cfg.auth0 === "object" ? cfg.auth0 : {}; - const connections = cfg.connections && typeof cfg.connections === "object" ? cfg.connections : {}; - // legacy: allowedEmails -> adminEmails - const adminEmails = Array.isArray(cfg.adminEmails) - ? cfg.adminEmails - : Array.isArray(cfg.allowedEmails) - ? cfg.allowedEmails - : []; - const base = { - auth0: { - domain: String(auth0.domain || "").trim(), - clientId: String(auth0.clientId || "").trim(), - }, - connections: { - google: String(connections.google || "").trim(), - kakao: String(connections.kakao || "").trim(), - naver: String(connections.naver || "").trim(), - }, - adminEmails: adminEmails.map((e) => String(e).trim().toLowerCase()).filter(Boolean), - }; + const base = buildAuthConfigBase(); const over = loadAuthOverride(); if (!over) return base; return { diff --git a/script.js b/script.js index 1986985..164f712 100644 --- a/script.js +++ b/script.js @@ -532,42 +532,47 @@ localStorage.removeItem(AUTH_OVERRIDE_KEY); } - function getAuthConfig() { + /** index.html(window.AUTH_CONFIG)만 반영. localStorage 캐시는 포함하지 않음. */ + function buildAuthConfigBase() { const cfg = globalThis.AUTH_CONFIG && typeof globalThis.AUTH_CONFIG === "object" ? globalThis.AUTH_CONFIG : {}; - const apiBase = String(cfg.apiBase || "").trim(); // optional, e.g. https://api.ncue.net + const apiBase = String(cfg.apiBase || "").trim(); const auth0 = cfg.auth0 && typeof cfg.auth0 === "object" ? cfg.auth0 : {}; - // legacy: allowedEmails -> adminEmails + const conn = cfg.connections && typeof cfg.connections === "object" ? cfg.connections : {}; const adminEmails = Array.isArray(cfg.adminEmails) ? cfg.adminEmails : Array.isArray(cfg.allowedEmails) ? cfg.allowedEmails : []; - const base = { + return { apiBase, auth0: { domain: String(auth0.domain || "").trim(), clientId: String(auth0.clientId || "").trim(), }, connections: { - google: "", - kakao: "", - naver: "", + google: String(conn.google || "").trim(), + kakao: String(conn.kakao || "").trim(), + naver: String(conn.naver || "").trim(), }, adminEmails: adminEmails.map((e) => String(e).trim().toLowerCase()).filter(Boolean), }; + } + + function getAuthConfig() { + const base = buildAuthConfigBase(); const override = loadAuthOverride(); if (!override) return base; - // override가 있으면 우선 적용 (서버 재배포 없이 테스트 가능) + // 서버에서 받아 둔 캐시(또는 예전 잘못된 값). 서버 .env 수정 후에는 hydrate가 덮어씀. return { - apiBase, + apiBase: base.apiBase, auth0: { domain: override.auth0.domain || base.auth0.domain, clientId: override.auth0.clientId || base.auth0.clientId, }, connections: { - google: override.connections?.google || "", - kakao: override.connections?.kakao || "", - naver: override.connections?.naver || "", + google: override.connections?.google || base.connections.google, + kakao: override.connections?.kakao || base.connections.kakao, + naver: override.connections?.naver || base.connections.naver, }, adminEmails: override.adminEmails.length ? override.adminEmails : base.adminEmails, }; @@ -585,9 +590,13 @@ } async function hydrateAuthConfigFromServerIfNeeded() { - const cfg = getAuthConfig(); - const hasLocal = Boolean(cfg.auth0.domain && cfg.auth0.clientId && cfg.connections.google); - if (hasLocal) return true; + const embedded = buildAuthConfigBase(); + const fullyInPage = Boolean( + embedded.auth0.domain && embedded.auth0.clientId && embedded.connections.google + ); + // index에 Auth0 전부 박혀 있으면 서버 조회 생략(오프라인/별도 배포용) + if (fullyInPage) return true; + try { const r = await fetch(apiUrl("/api/config/auth"), { cache: "no-store" }); if (!r.ok) return false; @@ -596,7 +605,6 @@ const v = data.value; const auth0 = v.auth0 || {}; const connections = v.connections || {}; - // legacy: allowedEmails -> adminEmails const adminEmails = Array.isArray(v.adminEmails) ? v.adminEmails : Array.isArray(v.allowedEmails) @@ -606,6 +614,7 @@ const clientId = String(auth0.clientId || "").trim(); const google = String(connections.google || "").trim(); if (!domain || !clientId || !google) return false; + // 예전 버전: 잘못된 도메인이 localStorage에 남으면 hydrate를 건너뛰어 영구 고착됨 → 매 로드마다 덮어씀 saveAuthOverride({ auth0: { domain, clientId }, connections: { google },