// /js/app-init.js // System 2 (신고 시스템) 앱 초기화 - SSO 인증 체크 (function() { 'use strict'; // ===== 리다이렉트 루프 방지 ===== var REDIRECT_KEY = '_sso_redirect_ts'; var REDIRECT_COOLDOWN = 5000; // 5초 내 재리다이렉트 방지 function safeRedirectToLogin() { var lastRedirect = parseInt(sessionStorage.getItem(REDIRECT_KEY) || '0', 10); var now = Date.now(); if (now - lastRedirect < REDIRECT_COOLDOWN) { console.warn('[System2] 리다이렉트 루프 감지 — 로그인 페이지로 이동하지 않음'); return; } sessionStorage.setItem(REDIRECT_KEY, String(now)); window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login'; } // ===== 쿠키 직접 읽기 (api-base.js의 cookieGet은 IIFE 내부이므로) ===== function cookieGet(name) { var match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)')); return match ? decodeURIComponent(match[1]) : null; } // ===== 인증 함수 (api-base.js의 전역 헬퍼 활용) ===== function isLoggedIn() { var token = window.getSSOToken ? window.getSSOToken() : localStorage.getItem('sso_token'); return token && token !== 'undefined' && token !== 'null'; } function getUser() { return window.getSSOUser ? window.getSSOUser() : (function() { var u = localStorage.getItem('sso_user'); return u ? JSON.parse(u) : null; })(); } function clearAuthData() { if (window.clearSSOAuth) { window.clearSSOAuth(); return; } localStorage.removeItem('sso_token'); localStorage.removeItem('sso_user'); } // ===== 메인 초기화 ===== async function init() { // 쿠키 우선 검증: 쿠키 없고 localStorage에만 토큰이 있으면 정리 var cookieToken = cookieGet('sso_token'); var localToken = localStorage.getItem('sso_token'); if (!cookieToken && localToken) { ['sso_token','sso_user','sso_refresh_token','token','user','access_token', 'currentUser','current_user','userInfo','userPageAccess'].forEach(function(k) { localStorage.removeItem(k); }); safeRedirectToLogin(); return; } // 1. 인증 확인 if (!isLoggedIn()) { clearAuthData(); safeRedirectToLogin(); return; } var currentUser = getUser(); if (!currentUser || !currentUser.username) { clearAuthData(); safeRedirectToLogin(); return; } // 협력업체 계정 차단 (JWT에서 partner_company_id 확인) var token = window.getSSOToken ? window.getSSOToken() : localStorage.getItem('sso_token'); if (token) { try { var payload = JSON.parse(atob(token.split('.')[1].replace(/-/g,'+').replace(/_/g,'/'))); if (payload.partner_company_id) { var h = window.location.hostname; window.location.href = h.includes('technicalkorea.net') ? 'https://tkpurchase.technicalkorea.net/partner-portal.html' : window.location.protocol + '//' + h + ':30480/partner-portal.html'; return; } } catch(e) { /* ignore decode errors */ } } // 인증 성공 — 루프 카운터 리셋 + localStorage 백업 sessionStorage.removeItem(REDIRECT_KEY); var token = window.getSSOToken ? window.getSSOToken() : null; if (token && !localStorage.getItem('sso_token')) localStorage.setItem('sso_token', token); console.log('[System2] 인증 확인:', currentUser.username); } // DOMContentLoaded 시 실행 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } // 전역 노출 window.appInit = { getUser: getUser, clearAuthData: clearAuthData, isLoggedIn: isLoggedIn }; })();