100 lines
2.9 KiB
JavaScript
100 lines
2.9 KiB
JavaScript
/* auth.js — авторизация */
|
|
|
|
function showLoginOverlay() {
|
|
document.getElementById('login-overlay').style.display = 'flex';
|
|
}
|
|
|
|
function hideLoginOverlay() {
|
|
document.getElementById('login-overlay').style.display = 'none';
|
|
}
|
|
|
|
async function doLogin() {
|
|
var btn = document.getElementById('l-btn');
|
|
var errEl = document.getElementById('l-error');
|
|
var token = (document.getElementById('l-token').value || '').trim();
|
|
var env = document.getElementById('l-env').value;
|
|
if (!token) { errEl.textContent = 'Введите токен'; errEl.style.display = 'block'; return; }
|
|
btn.disabled = true;
|
|
errEl.style.display = 'none';
|
|
try {
|
|
const res = await fetch(API_BASE + '/auth', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ token: token, env: env })
|
|
});
|
|
if (!res.ok) {
|
|
const d = await res.json().catch(function () { return {}; });
|
|
throw new Error(d.error || 'Ошибка входа');
|
|
}
|
|
localStorage.setItem('auth_token', token);
|
|
localStorage.setItem('auth_env', env);
|
|
setUserAvatar(token);
|
|
hideLoginOverlay();
|
|
// Проверяем статус NS — если не ready, показываем init overlay
|
|
try {
|
|
var sr = await fetch(API_BASE + '/ns/status', { headers: { 'X-Auth-Token': token, 'X-Auth-Env': env } });
|
|
var sd = await sr.json();
|
|
if (!sd.ready) {
|
|
pollNSStatus();
|
|
return;
|
|
}
|
|
} catch (_) { }
|
|
reloadAll();
|
|
} catch (e) {
|
|
errEl.textContent = e.message;
|
|
errEl.style.display = 'block';
|
|
} finally {
|
|
btn.disabled = false;
|
|
}
|
|
}
|
|
|
|
function jwtEmail(token) {
|
|
try {
|
|
var payload = JSON.parse(atob(token.split('.')[1].replace(/-/g,'+').replace(/_/g,'/')));
|
|
return payload.email || payload.sub || null;
|
|
} catch (_) { return null; }
|
|
}
|
|
|
|
function setUserAvatar(token) {
|
|
var el = document.getElementById('user-avatar');
|
|
if (!el) return;
|
|
var email = token ? jwtEmail(token) : null;
|
|
if (email) {
|
|
el.textContent = email;
|
|
el.title = email;
|
|
el.style.fontSize = '0.75rem';
|
|
el.style.minWidth = 'auto';
|
|
el.style.padding = '0 10px';
|
|
el.style.background = 'none';
|
|
el.style.border = '1px solid var(--border)';
|
|
el.style.borderRadius = '6px';
|
|
el.style.color = 'var(--text-primary)';
|
|
el.style.fontWeight = '400';
|
|
el.style.width = 'auto';
|
|
el.style.height = '30px';
|
|
} else {
|
|
el.textContent = 'N';
|
|
el.title = '';
|
|
el.style.cssText = '';
|
|
}
|
|
}
|
|
|
|
function doLogout() {
|
|
localStorage.removeItem('auth_token');
|
|
localStorage.removeItem('auth_env');
|
|
try { document.getElementById('l-token').value = ''; } catch (_) { }
|
|
setUserAvatar(null);
|
|
showLoginOverlay();
|
|
}
|
|
|
|
function checkAuth() {
|
|
var storedToken = localStorage.getItem('auth_token');
|
|
if (!storedToken) {
|
|
showLoginOverlay();
|
|
return;
|
|
}
|
|
setUserAvatar(storedToken);
|
|
hideLoginOverlay();
|
|
reloadAll();
|
|
}
|