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