Flask Session -> Double Token
This commit is contained in:
@@ -16,29 +16,10 @@
|
||||
});
|
||||
|
||||
// ─── Helpers ──────────────────────────────
|
||||
// 统一请求封装:自动附加 Authorization: Bearer <access>,401 时自动刷新并重试,
|
||||
// 刷新失败则清空 token 并跳转登录页(见 token.js)。
|
||||
function api(method, url, data, callback) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open(method, url);
|
||||
if (data && !(data instanceof FormData)) {
|
||||
xhr.setRequestHeader('Content-Type', 'application/json');
|
||||
}
|
||||
xhr.onload = function () {
|
||||
if (xhr.status === 401) {
|
||||
var res = JSON.parse(xhr.responseText || '{}');
|
||||
if (res.login_required) {
|
||||
location.href = '/login?view=control&next=' + encodeURIComponent(location.pathname + location.search);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (callback) callback(JSON.parse(xhr.responseText || '{}'));
|
||||
};
|
||||
if (data instanceof FormData) {
|
||||
xhr.send(data);
|
||||
} else if (data) {
|
||||
xhr.send(JSON.stringify(data));
|
||||
} else {
|
||||
xhr.send();
|
||||
}
|
||||
Auth.request(method, url, data, callback);
|
||||
}
|
||||
|
||||
// HTML escape for untrusted data — prevents XSS in innerHTML
|
||||
@@ -542,14 +523,18 @@
|
||||
|
||||
$('kick-all-btn').addEventListener('click', function () {
|
||||
var msg = $('mode-msg');
|
||||
api('POST', '/api/display/kick_all', null, function (res) {
|
||||
if (res.ok) {
|
||||
msg.textContent = '已踢掉所有显示端';
|
||||
msg.style.color = '#2e7d32';
|
||||
} else {
|
||||
msg.textContent = res.error || '操作失败';
|
||||
msg.style.color = '#E05555';
|
||||
}
|
||||
showConfirm('踢掉当前账号的所有设备', '将立即下线本账号的全部设备(含当前控制端),确定?', function () {
|
||||
msg.textContent = '正在下线全部设备...';
|
||||
api('POST', '/api/display/kick_all', null, function (res) {
|
||||
if (res.ok) {
|
||||
// 当前设备也会被踢下线:由 401 → refresh 失败 → 跳转登录页完成
|
||||
msg.textContent = '已下线本账号全部设备,即将跳转登录页';
|
||||
msg.style.color = '#2e7d32';
|
||||
} else {
|
||||
msg.textContent = res.error || '操作失败';
|
||||
msg.style.color = '#E05555';
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -579,7 +564,7 @@
|
||||
|
||||
// ─── Logout ────────────────────────────────
|
||||
$('logout-btn').addEventListener('click', function () {
|
||||
api('POST', '/api/auth/logout', null, function () {
|
||||
Auth.logout(function () {
|
||||
location.href = '/login?view=control';
|
||||
});
|
||||
});
|
||||
@@ -1369,6 +1354,24 @@
|
||||
|
||||
$('user-refresh-btn').addEventListener('click', loadUsers);
|
||||
|
||||
// Root: kick every user's devices (control + display, all accounts)
|
||||
var kickAllUsersBtn = $('kick-all-users-btn');
|
||||
if (kickAllUsersBtn) {
|
||||
kickAllUsersBtn.addEventListener('click', function () {
|
||||
showConfirm('踢掉所有用户', '所有用户的控制端与显示端将立即全部下线(包含当前设备),确定?', function () {
|
||||
_reauthThen(function () {
|
||||
api('POST', '/api/admin/kick_all_users', null, function (res) {
|
||||
if (res.ok) {
|
||||
toast('已踢掉所有用户,即将下线');
|
||||
} else {
|
||||
toast(res.error || '操作失败');
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ─── Init ─────────────────────────────────
|
||||
loadGroups();
|
||||
updateEventGroupSelects();
|
||||
|
||||
Reference in New Issue
Block a user