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 return data
} }
// Проверяем авторизацию по наличию cookie (без лишнего запроса) // Проверяем авторизацию через запрос к бэкенду (куки HttpOnly не читаются JS)
export async function checkAuth() { export async function checkAuth() {
const token = getAuthToken() try {
if (!token) { // Проверяем токен в памяти или делаем запрос к бэкенду
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 } return { authenticated: false }
} }
// Просто проверяем наличие токена и возвращаем username
return { authenticated: true, user: { username: getUsername() } }
} }

View File

@@ -1,26 +1,18 @@
/** /**
* Утилиты для работы с cookie * Утилиты для работы с cookie
* Примечание: auth_token и username устанавливаются бэкендом через Set-Cookie
* Фронтенд только читает их через API ответы
*/ */
const TOKEN_COOKIE_NAME = 'auth_token' const TOKEN_COOKIE_NAME = 'auth_token'
const USERNAME_COOKIE_NAME = 'username' const USERNAME_COOKIE_NAME = 'username'
/** // Временное хранилище для токена (до тех пор пока бэкенд не вернёт куки)
* Устанавливает cookie let tempToken = null
* @param {string} name - имя cookie let tempUsername = null
* @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}`
}
/** /**
* Получает cookie по имени * Получает cookie по имени (только для не-Httponly куки)
* @param {string} name - имя cookie * @param {string} name - имя cookie
* @returns {string|null} значение cookie или null * @returns {string|null} значение cookie или null
*/ */
@@ -37,20 +29,12 @@ function getCookie(name) {
return null 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 - токен * @param {string} token - токен
*/ */
export function setAuthToken(token) { export function setAuthToken(token) {
setCookie(TOKEN_COOKIE_NAME, token, 30) tempToken = token
} }
/** /**
@@ -58,7 +42,7 @@ export function setAuthToken(token) {
* @param {string} username - имя пользователя * @param {string} username - имя пользователя
*/ */
export function setUsername(username) { export function setUsername(username) {
setCookie(USERNAME_COOKIE_NAME, username, 30) tempUsername = username
} }
/** /**
@@ -66,7 +50,7 @@ export function setUsername(username) {
* @returns {string|null} * @returns {string|null}
*/ */
export function getAuthToken() { export function getAuthToken() {
return getCookie(TOKEN_COOKIE_NAME) return tempToken || getCookie(TOKEN_COOKIE_NAME)
} }
/** /**
@@ -74,7 +58,7 @@ export function getAuthToken() {
* @returns {string|null} * @returns {string|null}
*/ */
export function getUsername() { export function getUsername() {
return getCookie(USERNAME_COOKIE_NAME) return tempUsername || getCookie(USERNAME_COOKIE_NAME)
} }
/** /**
@@ -89,14 +73,20 @@ export function isAuthenticated() {
* Выполняет выход из системы * Выполняет выход из системы
*/ */
export function logout() { export function logout() {
removeCookie(TOKEN_COOKIE_NAME) tempToken = null
removeCookie(USERNAME_COOKIE_NAME) tempUsername = null
// Очистка через API (бэкенд удалит куки)
return fetch('/api/8004/logout', {
method: 'POST',
credentials: 'include'
})
} }
/** /**
* Очищает все данные авторизации * Очищает все данные авторизации
*/ */
export function clearAuthData() { export function clearAuthData() {
logout() tempToken = null
tempUsername = null
} }