84 lines
2.9 KiB
JavaScript
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 = 'Войти';
|
|
}
|
|
}); |