Files
tk-factory-services/system2-report/web/js/app-init.js
Hyungi Ahn b800792152 feat: 구매/안전 시스템 전면 개편 — tkpurchase 개편 + tksafety 신규 + 권한 보강
Phase 1: tkuser 협력업체 CRUD 이관 (읽기전용 → 전체 CRUD)
Phase 2: tkpurchase 개편 — 일용공 신청/확정, 작업일정, 업무현황, 계정관리, 협력업체 포털
Phase 3: tksafety 신규 시스템 — 방문관리 + 안전교육 신고
Phase 4: SSO 인증 보강 (partner_company_id JWT, 만료일 체크), 권한 테이블 기반 접근 제어

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 17:42:59 +09:00

89 lines
3.0 KiB
JavaScript

// /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의 전역 헬퍼 활용) =====
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() {
// 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 };
})();