ghfdrf
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-05-31 18:51:35 +10:00
parent 28f443a393
commit 27cc9cc972
2 changed files with 42 additions and 35 deletions

View File

@@ -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() } }
}

View File

@@ -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
}