- FastAPI 라우터에서 슬래시 문제로 인한 307 리다이렉트 수정 - Nginx 프록시 설정에서 경로 중복 문제 해결 - 계정 관리 시스템 구현 (로그인, 사용자 관리, 권한 설정) - 노트북 연결 기능 수정 (notebook_id 필드 추가) - 메모 트리 UI 개선 (수평 레이아웃, 드래그 기능 제거) - 헤더 UI 개선 및 고정 위치 설정 - 백업/복원 스크립트 추가 - PDF 미리보기 토큰 인증 지원
93 lines
2.8 KiB
JavaScript
93 lines
2.8 KiB
JavaScript
/**
|
|
* 인증 가드 - 모든 보호된 페이지에서 사용
|
|
* 로그인하지 않은 사용자를 자동으로 로그인 페이지로 리다이렉트
|
|
*/
|
|
|
|
(function() {
|
|
'use strict';
|
|
|
|
// 인증이 필요하지 않은 페이지들
|
|
const PUBLIC_PAGES = [
|
|
'login.html',
|
|
'setup.html'
|
|
];
|
|
|
|
// 현재 페이지가 공개 페이지인지 확인
|
|
function isPublicPage() {
|
|
const currentPath = window.location.pathname;
|
|
return PUBLIC_PAGES.some(page => currentPath.includes(page));
|
|
}
|
|
|
|
// 로그인 페이지로 리다이렉트
|
|
function redirectToLogin() {
|
|
const currentUrl = encodeURIComponent(window.location.href);
|
|
console.log('🔐 인증되지 않은 접근. 로그인 페이지로 이동합니다.');
|
|
window.location.href = `login.html?redirect=${currentUrl}`;
|
|
}
|
|
|
|
// 인증 체크 함수
|
|
async function checkAuthentication() {
|
|
// 공개 페이지는 체크하지 않음
|
|
if (isPublicPage()) {
|
|
return;
|
|
}
|
|
|
|
const token = localStorage.getItem('access_token');
|
|
|
|
// 토큰이 없으면 즉시 리다이렉트
|
|
if (!token) {
|
|
redirectToLogin();
|
|
return;
|
|
}
|
|
|
|
try {
|
|
// 토큰 유효성 검사
|
|
const response = await fetch('/api/auth/me', {
|
|
headers: {
|
|
'Authorization': `Bearer ${token}`,
|
|
'Content-Type': 'application/json'
|
|
}
|
|
});
|
|
|
|
if (!response.ok) {
|
|
console.log('🔐 토큰이 유효하지 않습니다. 상태:', response.status);
|
|
localStorage.removeItem('access_token');
|
|
redirectToLogin();
|
|
return;
|
|
}
|
|
|
|
// 인증 성공
|
|
const user = await response.json();
|
|
console.log('✅ 인증 성공:', user.email);
|
|
|
|
// 전역 사용자 정보 설정
|
|
window.currentUser = user;
|
|
|
|
// 헤더 사용자 메뉴 업데이트
|
|
if (typeof window.updateUserMenu === 'function') {
|
|
window.updateUserMenu(user);
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('🔐 인증 확인 중 오류:', error);
|
|
localStorage.removeItem('access_token');
|
|
redirectToLogin();
|
|
}
|
|
}
|
|
|
|
// DOM 로드 완료 전에 인증 체크 실행
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', checkAuthentication);
|
|
} else {
|
|
checkAuthentication();
|
|
}
|
|
|
|
// 전역 함수로 노출
|
|
window.authGuard = {
|
|
checkAuthentication,
|
|
redirectToLogin,
|
|
isPublicPage
|
|
};
|
|
|
|
})();
|