Files
toolbox/api/static/js/auth.js
T

84 lines
2.9 KiB
JavaScript

// auth.js
import { setCookie } from '/static/js/cookies.js';
import { apiRequest } from '/static/js/api.js';
const form = document.getElementById('loginForm');
const loginInput = document.getElementById('loginInput');
const passwordInput = document.getElementById('passwordInput');
const submitBtn = document.getElementById('submitBtn');
const formError = document.getElementById('formError');
function showError(msg) {
formError.hidden = false;
formError.textContent = msg;
}
function clearError() {
formError.hidden = true;
formError.textContent = '';
}
async function getUserEndpoint() {
const meta = document.querySelector('meta[name="userAuth-endpoint"]');
return meta ? meta.getAttribute('content') : '/user';
}
form.addEventListener('submit', async (ev) => {
ev.preventDefault();
clearError();
submitBtn.disabled = true;
submitBtn.textContent = 'Входим...';
const login = loginInput.value.trim();
const password = passwordInput.value;
if (!login || !password) {
showError('Введите логин и пароль');
submitBtn.disabled = false;
submitBtn.textContent = 'Войти';
return;
}
try {
const url = await getUserEndpoint();
// Отправляем данные
const resp = await apiRequest(url, { login, password });
// Пример ожидаемого формата:
// { "status": "ok" | "error", "user": {...}, "access": {...} }
if (!resp || typeof resp !== 'object') {
throw new Error('Некорректный ответ от сервера');
}
if (resp.status && (resp.status === 'error' || resp.status === 'fail')) {
// Ошибка авторизации
showError(resp.message || 'Неправильный логин или пароль');
submitBtn.disabled = false;
submitBtn.textContent = 'Войти';
return;
}
// Если статус == success / ok / authenticated и есть user + access — считаем успешной
const okStatuses = new Set(['ok', 'success', 'authenticated']);
const isOk = resp.status && okStatuses.has(String(resp.status).toLowerCase());
// fallback: если resp.user или resp.access присутствуют — считаем ок
const hasData = resp.user && typeof resp.user === 'object' && resp.access && typeof resp.access === 'object';
if (!isOk && !hasData) {
showError('Авторизация не выполнена: пустой ответ');
submitBtn.disabled = false;
submitBtn.textContent = 'Войти';
return;
}
await setCookie('toolbox_user', JSON.stringify(resp.user));
await setCookie('toolbox_access', JSON.stringify(resp.access));
window.location.href = '/'; // или другой URL
} catch (err) {
console.error(err);
showError(err.message || 'Ошибка при авторизации');
submitBtn.disabled = false;
submitBtn.textContent = 'Войти';
}
});