Новые правки

This commit is contained in:
Web-serfer 2026-05-07 20:20:55 +05:00
parent 48c750db0d
commit f182c0e5b1
3 changed files with 82 additions and 26 deletions

View file

@ -517,30 +517,62 @@ import { COMPANY } from "@constants";
`; `;
document.getElementById('mobile-logout-btn')?.addEventListener('click', async () => { document.getElementById('mobile-logout-btn')?.addEventListener('click', async () => {
try { try {
await fetch('/api/auth/logout', { method: 'POST' }); await fetch('/api/auth/logout', { method: 'POST' });
} catch (e) {} } catch (e) {
// Очищаем localStorage console.error('Logout error:', e);
localStorage.removeItem('auth_token'); }
localStorage.removeItem('user');
localStorage.removeItem('pocketbase_auth'); // Очищаем localStorage полностью
// Удаляем cookie pb_auth localStorage.clear();
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'); // Удаляем cookie pb_auth всеми возможными способами
window.location.reload(); 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 () => { document.getElementById('logout-btn')?.addEventListener('click', async () => {
try { try {
await fetch('/api/auth/logout', { method: 'POST' }); await fetch('/api/auth/logout', { method: 'POST' });
} catch (e) {} } catch (e) {
localStorage.removeItem('auth_token'); console.error('Logout error:', e);
localStorage.removeItem('user'); }
localStorage.removeItem('pocketbase_auth');
// Очищаем 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'); document.querySelector('.header-right')?.classList.remove('auth-active');
// Остаемся на той же странице
window.location.reload(); window.location.reload();
}); });

View file

@ -107,13 +107,24 @@ const firstLetter = userName ? userName.charAt(0).toUpperCase() : userEmail?.cha
console.error('Logout error:', e); console.error('Logout error:', e);
} }
// Очищаем localStorage // Очищаем localStorage полностью
localStorage.removeItem('auth_token'); localStorage.clear();
localStorage.removeItem('user');
localStorage.removeItem('pocketbase_auth');
// Удаляем cookie pb_auth // Удаляем cookie pb_auth всеми возможными способами
document.cookie = 'pb_auth=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT'; 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(); window.location.reload();

View file

@ -1,10 +1,23 @@
import type { APIRoute } from 'astro'; import type { APIRoute } from 'astro';
export const POST: APIRoute = async ({ cookies }) => { export const POST: APIRoute = async ({ cookies, url }) => {
// Удаляем куку на сервере // Удаляем куку на сервере
cookies.delete('pb_auth', { path: '/' }); 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({ return new Response(JSON.stringify({
success: true, success: true,
message: 'Вы успешно вышли из аккаунта' message: 'Вы успешно вышли из аккаунта'
@ -12,8 +25,8 @@ export const POST: APIRoute = async ({ cookies }) => {
status: 200, status: 200,
headers: { headers: {
'Content-Type': 'application/json', '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],
} }
}); });
}; };