diff --git a/src/services/authService.js b/src/services/authService.js index db6cadc..ac65b9f 100644 --- a/src/services/authService.js +++ b/src/services/authService.js @@ -13,15 +13,32 @@ export async function login(username, password) { return data } -// Проверяем авторизацию по наличию cookie (без лишнего запроса) +// Проверяем авторизацию через запрос к бэкенду (куки HttpOnly не читаются JS) export async function checkAuth() { - const token = getAuthToken() - if (!token) { + try { + // Проверяем токен в памяти или делаем запрос к бэкенду + const token = getAuthToken() + if (!token) { + return { authenticated: false } + } + + // Делаем запрос для валидации токена/куки + const response = await api8004.get('/check-auth', { + validateStatus: () => true + }) + + if (response.status === 200 && response.data?.authenticated) { + // Сохраняем username из ответа + if (response.data.username) { + setUsername(response.data.username) + } + return { authenticated: true, user: { username: response.data.username } } + } + + return { authenticated: false } + } catch (error) { return { authenticated: false } } - - // Просто проверяем наличие токена и возвращаем username - return { authenticated: true, user: { username: getUsername() } } } diff --git a/src/utils/auth.js b/src/utils/auth.js index e64a325..9672c2e 100644 --- a/src/utils/auth.js +++ b/src/utils/auth.js @@ -1,26 +1,18 @@ /** * Утилиты для работы с cookie + * Примечание: auth_token и username устанавливаются бэкендом через Set-Cookie + * Фронтенд только читает их через API ответы */ const TOKEN_COOKIE_NAME = 'auth_token' const USERNAME_COOKIE_NAME = 'username' -/** - * Устанавливает cookie - * @param {string} name - имя cookie - * @param {string} value - значение cookie - * @param {number} days - срок хранения в днях - */ -function setCookie(name, value, days = 30) { - const date = new Date() - date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000) - const expires = `expires=${date.toUTCString()}` - const secureFlag = window.location.protocol === 'https:' ? ';Secure' : '' - document.cookie = `${name}=${encodeURIComponent(value)};${expires};path=/;SameSite=Lax${secureFlag}` -} +// Временное хранилище для токена (до тех пор пока бэкенд не вернёт куки) +let tempToken = null +let tempUsername = null /** - * Получает cookie по имени + * Получает cookie по имени (только для не-Httponly куки) * @param {string} name - имя cookie * @returns {string|null} значение cookie или null */ @@ -37,20 +29,12 @@ function getCookie(name) { return null } -/** - * Удаляет cookie - * @param {string} name - имя cookie - */ -function removeCookie(name) { - document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/` -} - /** * Сохраняет токен авторизации (для совместимости) * @param {string} token - токен */ export function setAuthToken(token) { - setCookie(TOKEN_COOKIE_NAME, token, 30) + tempToken = token } /** @@ -58,7 +42,7 @@ export function setAuthToken(token) { * @param {string} username - имя пользователя */ export function setUsername(username) { - setCookie(USERNAME_COOKIE_NAME, username, 30) + tempUsername = username } /** @@ -66,7 +50,7 @@ export function setUsername(username) { * @returns {string|null} */ export function getAuthToken() { - return getCookie(TOKEN_COOKIE_NAME) + return tempToken || getCookie(TOKEN_COOKIE_NAME) } /** @@ -74,7 +58,7 @@ export function getAuthToken() { * @returns {string|null} */ export function getUsername() { - return getCookie(USERNAME_COOKIE_NAME) + return tempUsername || getCookie(USERNAME_COOKIE_NAME) } /** @@ -89,14 +73,20 @@ export function isAuthenticated() { * Выполняет выход из системы */ export function logout() { - removeCookie(TOKEN_COOKIE_NAME) - removeCookie(USERNAME_COOKIE_NAME) + tempToken = null + tempUsername = null + // Очистка через API (бэкенд удалит куки) + return fetch('/api/8004/logout', { + method: 'POST', + credentials: 'include' + }) } /** * Очищает все данные авторизации */ export function clearAuthData() { - logout() + tempToken = null + tempUsername = null }