This commit is contained in:
@@ -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() } }
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user