diff --git a/frontend/src/components/layout/header/Header.astro b/frontend/src/components/layout/header/Header.astro index 26ffb53..49f4036 100644 --- a/frontend/src/components/layout/header/Header.astro +++ b/frontend/src/components/layout/header/Header.astro @@ -517,30 +517,62 @@ import { COMPANY } from "@constants"; `; document.getElementById('mobile-logout-btn')?.addEventListener('click', async () => { - try { - await fetch('/api/auth/logout', { method: 'POST' }); - } catch (e) {} - // Очищаем localStorage - localStorage.removeItem('auth_token'); - localStorage.removeItem('user'); - localStorage.removeItem('pocketbase_auth'); - // Удаляем cookie pb_auth - document.cookie = 'pb_auth=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT'; - document.querySelector('.header-right')?.classList.remove('auth-active'); - window.location.reload(); + try { + await fetch('/api/auth/logout', { method: 'POST' }); + } catch (e) { + console.error('Logout error:', e); + } + + // Очищаем localStorage полностью + localStorage.clear(); + + // Удаляем cookie pb_auth всеми возможными способами + const cookieName = 'pb_auth'; + const domains = ['', window.location.hostname, '.' + window.location.hostname]; + const paths = ['/', '/api']; + + domains.forEach(domain => { + paths.forEach(path => { + document.cookie = `${cookieName}=; path=${path}; domain=${domain}; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT`; + document.cookie = `${cookieName}=; path=${path}; domain=${domain}; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Lax`; + document.cookie = `${cookieName}=; path=${path}; domain=${domain}; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict`; }); + }); + + // Альтернативный способ - перезапись пустым значением + document.cookie = 'pb_auth=; path=/; max-age=0'; + document.cookie = 'pb_auth=; path=/; expires=1970-01-01'; + + document.querySelector('.header-right')?.classList.remove('auth-active'); + window.location.reload(); + }); } // Обработчик выхода document.getElementById('logout-btn')?.addEventListener('click', async () => { try { await fetch('/api/auth/logout', { method: 'POST' }); - } catch (e) {} - localStorage.removeItem('auth_token'); - localStorage.removeItem('user'); - localStorage.removeItem('pocketbase_auth'); + } catch (e) { + console.error('Logout error:', e); + } + + // Очищаем localStorage полностью + localStorage.clear(); + + // Удаляем cookie pb_auth всеми возможными способами + const cookieName = 'pb_auth'; + const domains = ['', window.location.hostname, '.' + window.location.hostname]; + const paths = ['/', '/api']; + + domains.forEach(domain => { + paths.forEach(path => { + document.cookie = `${cookieName}=; path=${path}; domain=${domain}; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT`; + document.cookie = `${cookieName}=; path=${path}; domain=${domain}; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Lax`; + document.cookie = `${cookieName}=; path=${path}; domain=${domain}; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict`; + }); + }); + document.querySelector('.header-right')?.classList.remove('auth-active'); - // Остаемся на той же странице window.location.reload(); }); diff --git a/frontend/src/components/layout/header/UserMenu.astro b/frontend/src/components/layout/header/UserMenu.astro index 975b7a2..78ea01b 100644 --- a/frontend/src/components/layout/header/UserMenu.astro +++ b/frontend/src/components/layout/header/UserMenu.astro @@ -107,13 +107,24 @@ const firstLetter = userName ? userName.charAt(0).toUpperCase() : userEmail?.cha console.error('Logout error:', e); } - // Очищаем localStorage - localStorage.removeItem('auth_token'); - localStorage.removeItem('user'); - localStorage.removeItem('pocketbase_auth'); + // Очищаем localStorage полностью + localStorage.clear(); - // Удаляем cookie pb_auth - document.cookie = 'pb_auth=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT'; + // Удаляем cookie pb_auth всеми возможными способами + const cookieName = 'pb_auth'; + const domains = ['', window.location.hostname, '.' + window.location.hostname]; + const paths = ['/', '/api']; + + domains.forEach(domain => { + paths.forEach(path => { + document.cookie = `${cookieName}=; path=${path}; domain=${domain}; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT`; + document.cookie = `${cookieName}=; path=${path}; domain=${domain}; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Lax`; + document.cookie = `${cookieName}=; path=${path}; domain=${domain}; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict`; + }); + }); + + // Альтернативный способ + document.cookie = 'pb_auth=; path=/; max-age=0'; // Полностью перезагружаем страницу window.location.reload(); diff --git a/frontend/src/pages/api/auth/sign-out.ts b/frontend/src/pages/api/auth/sign-out.ts index 18edac7..0ac8e26 100644 --- a/frontend/src/pages/api/auth/sign-out.ts +++ b/frontend/src/pages/api/auth/sign-out.ts @@ -1,10 +1,23 @@ import type { APIRoute } from 'astro'; -export const POST: APIRoute = async ({ cookies }) => { +export const POST: APIRoute = async ({ cookies, url }) => { // Удаляем куку на сервере cookies.delete('pb_auth', { path: '/' }); + + const host = url.hostname; + const isSecure = url.protocol === 'https:'; + + // Формируем заголовки для удаления cookie со всех возможных комбинаций + const setCookieHeaders = [ + 'pb_auth=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT', + 'pb_auth=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Lax', + 'pb_auth=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict', + 'pb_auth=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure', + `pb_auth=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=${host}`, + `pb_auth=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=.${host}`, + ]; - // Возвращаем заголовок для удаления куки на клиенте + // Возвращаем заголовки для удаления куки на клиенте return new Response(JSON.stringify({ success: true, message: 'Вы успешно вышли из аккаунта' @@ -12,8 +25,8 @@ export const POST: APIRoute = async ({ cookies }) => { status: 200, headers: { 'Content-Type': 'application/json', - // Принудительно удаляем куку на клиенте - два варианта для надежности - 'Set-Cookie': 'pb_auth=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT', + // Основной заголовок для удаления + 'Set-Cookie': setCookieHeaders[0], } }); }; \ No newline at end of file