관리자 세션 해제 시 런처 일반 화면 전환

This commit is contained in:
seo
2026-07-11 06:17:22 +09:00
parent 2106830a47
commit 6aef96ecdb
3 changed files with 25 additions and 4 deletions
+1 -1
View File
@@ -43,7 +43,7 @@
Rhymix 사이트 관리자 로그인 상태에서는 나의 찾기, 콕 찌르기, 니모, 프로젝트, Block, Notice, Weblog, Speed Stats를 4개씩 2줄로 표시합니다. 프로젝트 바로가기는 공개 저장소 목록인 `https://git.chaegeon.com/explore/repos`로 이동합니다. 관리자 상태에서 미니앱을 실행하면 공통 암호를 묻지 않습니다. 이때 `/custom/launcher/api.php?adminSession=1` 또는 `session=1` 응답에서 관리자 공통 접근 쿠키를 함께 발급해, 이동한 미니앱 내부 세션 검사에서도 바로 통과합니다.
공통 암호로 로그인한 일반 인증 쿠키는 30분만 유지합니다. 사이트 관리자 세션이 확인되어 발급된 관리자 인증 쿠키는 반영구 운영값으로 10년 유지합니다. `/custom/launcher/api.php?session=1`은 현재 브라우저가 가진 공통 쿠키 또는 사이트 관리자 세션을 확인하고, `/custom/launcher/api.php?adminSession=1`은 관리 버튼 노출처럼 실제 Rhymix 관리자 세션이 필요한 화면에서만 사용합니다.
공통 암호로 로그인한 일반 인증 쿠키는 30분만 유지합니다. 사이트 관리자 세션이 확인되어 발급된 관리자 인증 쿠키는 반영구 운영값으로 10년 유지합니다. `/custom/launcher/api.php?session=1`은 현재 브라우저가 가진 공통 쿠키 또는 사이트 관리자 세션을 확인하고, `/custom/launcher/api.php?adminSession=1`은 관리 버튼 노출처럼 실제 Rhymix 관리자 세션이 필요한 화면에서만 사용합니다. `adminSession=1`은 일반 공통 쿠키를 인증으로 섞지 않고 실제 관리자 여부만 내려줍니다. 런처가 관리자 아이콘을 표시한 뒤에도 브라우저 포커스가 돌아오거나 탭이 다시 보이면 관리자 세션을 재확인하고, 이미 관리자 로그인이 풀렸으면 일반 사용자 화면으로 다시 그립니다.
Rhymix 로그인 실패 차단 세션이 살아 있으면 `session=1` 응답이 `loginBlocked`를 내려줍니다. 이때 런처는 아이콘, 관리 버튼, PIN 입력을 숨기고 빨간 제한 안내만 표시합니다.
+1 -1
View File
@@ -100,7 +100,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
if ($isAdmin) {
custom_issue_auth_cookie(true);
}
custom_json(['admin' => $isAdmin, 'authenticated' => $isAdmin || custom_has_auth_cookie()]);
custom_json(['admin' => $isAdmin, 'authenticated' => $isAdmin]);
}
if (isset($_GET['failMessages'])) {
+23 -2
View File
@@ -1,5 +1,6 @@
const shortcut = document.getElementById('findMyShortcut');
let failIndex = 0;
let lastRenderedAdmin = null;
const apiUrl = '/custom/launcher/api.php';
const PIN_LENGTH = 4;
@@ -83,6 +84,7 @@ async function renderIcons() {
}
const isAdmin = !!session.admin;
lastRenderedAdmin = isAdmin;
const items = isAdmin ? adminIconItems : userIconItems;
shortcut.className = `find-container ${isAdmin ? 'launcher-admin-grid' : ''}`;
shortcut.innerHTML = '';
@@ -119,8 +121,12 @@ async function renderIcons() {
}
async function hasAdminSession() {
const session = await getSession();
return !!session.admin;
try {
const session = await fetch(`${apiUrl}?adminSession=1`, { credentials: 'same-origin' }).then(res => res.json());
return !!session.admin;
} catch (_) {
return false;
}
}
async function getSession() {
@@ -149,6 +155,21 @@ async function requireAccess(nextAction) {
showPasswordForm(nextAction);
}
async function refreshAdminModeIfNeeded() {
if (lastRenderedAdmin !== true) return;
const isAdmin = await hasAdminSession();
if (!isAdmin) {
await renderIcons();
}
}
document.addEventListener('visibilitychange', () => {
if (!document.hidden) {
refreshAdminModeIfNeeded();
}
});
window.addEventListener('focus', refreshAdminModeIfNeeded);
function renderLoginBlocked(session = {}) {
shortcut.className = 'launcher-blocked';
shortcut.innerHTML = '';