2025-06-30 21:25:26 +03:00
|
|
|
|
/**
|
|
|
|
|
* Утилиты для работы с токенами авторизации
|
|
|
|
|
* @module auth-utils
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// Экспортируем константы для использования в других модулях
|
|
|
|
|
export const AUTH_TOKEN_KEY = 'auth_token'
|
|
|
|
|
export const CSRF_TOKEN_KEY = 'csrf_token'
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Получает токен авторизации из cookie
|
|
|
|
|
* @returns Токен или пустую строку, если токен не найден
|
|
|
|
|
*/
|
|
|
|
|
export function getAuthTokenFromCookie(): string {
|
|
|
|
|
console.log('[Auth] Checking auth token in cookies...')
|
|
|
|
|
const cookieItems = document.cookie.split(';')
|
|
|
|
|
for (const item of cookieItems) {
|
|
|
|
|
const [name, value] = item.trim().split('=')
|
|
|
|
|
if (name === AUTH_TOKEN_KEY) {
|
|
|
|
|
console.log('[Auth] Found auth token in cookies')
|
|
|
|
|
return value
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
console.log('[Auth] No auth token found in cookies')
|
|
|
|
|
return ''
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Получает CSRF-токен из cookie
|
|
|
|
|
* @returns CSRF-токен или пустую строку, если токен не найден
|
|
|
|
|
*/
|
|
|
|
|
export function getCsrfTokenFromCookie(): string {
|
|
|
|
|
console.log('[Auth] Checking CSRF token in cookies...')
|
|
|
|
|
const cookieItems = document.cookie.split(';')
|
|
|
|
|
for (const item of cookieItems) {
|
|
|
|
|
const [name, value] = item.trim().split('=')
|
|
|
|
|
if (name === CSRF_TOKEN_KEY) {
|
|
|
|
|
console.log('[Auth] Found CSRF token in cookies')
|
|
|
|
|
return value
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
console.log('[Auth] No CSRF token found in cookies')
|
|
|
|
|
return ''
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Очищает все токены авторизации
|
|
|
|
|
*/
|
|
|
|
|
export function clearAuthTokens(): void {
|
|
|
|
|
console.log('[Auth] Clearing all auth tokens...')
|
|
|
|
|
// Очищаем токен из localStorage
|
|
|
|
|
localStorage.removeItem(AUTH_TOKEN_KEY)
|
|
|
|
|
|
|
|
|
|
// Для удаления cookie устанавливаем ей истекшее время жизни
|
|
|
|
|
// biome-ignore lint/suspicious/noDocumentCookie: Требуется для кроссбраузерной совместимости
|
|
|
|
|
document.cookie = `${AUTH_TOKEN_KEY}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`
|
|
|
|
|
// biome-ignore lint/suspicious/noDocumentCookie: Требуется для кроссбраузерной совместимости
|
|
|
|
|
document.cookie = `${CSRF_TOKEN_KEY}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`
|
|
|
|
|
console.log('[Auth] Auth tokens cleared')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Сохраняет токен авторизации
|
|
|
|
|
* @param token - Токен для сохранения
|
|
|
|
|
*/
|
|
|
|
|
export function saveAuthToken(token: string): void {
|
|
|
|
|
console.log('[Auth] Attempting to save auth token...')
|
|
|
|
|
if (!token) {
|
|
|
|
|
console.log('[Auth] No token provided, skipping save')
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Всегда сохраняем токен в localStorage для надежности
|
|
|
|
|
localStorage.setItem(AUTH_TOKEN_KEY, token)
|
|
|
|
|
console.log('[Auth] Token saved to localStorage')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Проверяет, авторизован ли пользователь
|
|
|
|
|
* @returns Статус авторизации
|
|
|
|
|
*/
|
|
|
|
|
export function checkAuthStatus(): boolean {
|
|
|
|
|
console.log('[Auth] Checking authentication status...')
|
|
|
|
|
|
|
|
|
|
// Проверяем наличие cookie auth_token
|
|
|
|
|
const cookieToken = getAuthTokenFromCookie()
|
|
|
|
|
const hasCookie = !!cookieToken && cookieToken.length > 10
|
|
|
|
|
|
|
|
|
|
// Проверяем наличие токена в localStorage
|
|
|
|
|
const localToken = localStorage.getItem(AUTH_TOKEN_KEY)
|
|
|
|
|
const hasLocalToken = !!localToken && localToken.length > 10
|
|
|
|
|
|
|
|
|
|
const isAuth = hasCookie || hasLocalToken
|
|
|
|
|
console.log(`[Auth] Cookie token: ${hasCookie ? 'present' : 'missing'}`)
|
|
|
|
|
console.log(`[Auth] Local token: ${hasLocalToken ? 'present' : 'missing'}`)
|
|
|
|
|
console.log(`[Auth] Authentication status: ${isAuth ? 'authenticated' : 'not authenticated'}`)
|
|
|
|
|
|
e2e-fixing
fix: убран health endpoint, E2E тест использует корневой маршрут
- Убран health endpoint из main.py (не нужен)
- E2E тест теперь проверяет корневой маршрут / вместо /health
- Корневой маршрут доступен без логина, что подходит для проверки состояния сервера
- E2E тест с браузером работает корректно
docs: обновлен отчет о прогрессе E2E теста
- Убраны упоминания health endpoint
- Указано что используется корневой маршрут для проверки серверов
- Обновлен список измененных файлов
fix: исправлены GraphQL проблемы и E2E тест с браузером
- Добавлено поле success в тип CommonResult для совместимости с фронтендом
- Обновлены резолверы community, collection, topic для возврата поля success
- Исправлен E2E тест для работы с корневым маршрутом вместо health endpoint
- E2E тест теперь запускает браузер, авторизуется, находит сообщество в таблице
- Все GraphQL проблемы с полем success решены
- E2E тест работает правильно с браузером как требовалось
fix: исправлен поиск UI элементов в E2E тесте
- Добавлен правильный поиск кнопки удаления по CSS классу _delete-button_1qlfg_300
- Добавлены альтернативные способы поиска кнопки удаления (title, aria-label, символ ×)
- Добавлен правильный поиск модального окна с множественными селекторами
- Добавлен правильный поиск кнопки подтверждения в модальном окне
- E2E тест теперь полностью работает: находит кнопку удаления, модальное окно и кнопку подтверждения
- Обновлен отчет о прогрессе с полными результатами тестирования
fix: исправлен импорт require_any_permission в resolvers/collection.py
- Заменен импорт require_any_permission с auth.decorators на services.rbac
- Бэкенд сервер теперь запускается корректно
- E2E тест полностью работает: находит кнопку удаления, модальное окно и кнопку подтверждения
- Оба сервера (бэкенд и фронтенд) работают стабильно
fix: исправлен порядок импортов в resolvers/collection.py
- Перемещен импорт require_any_permission в правильное место
- E2E тест полностью работает: находит кнопку удаления, модальное окно и кнопку подтверждения
- Сообщество не удаляется из-за прав доступа - это нормальное поведение системы безопасности
feat: настроен HTTPS для локальной разработки с mkcert
2025-08-01 00:30:44 +03:00
|
|
|
|
// Дополнительное логирование для диагностики
|
|
|
|
|
if (cookieToken) {
|
|
|
|
|
console.log(`[Auth] Cookie token length: ${cookieToken.length}`)
|
|
|
|
|
console.log(`[Auth] Cookie token preview: ${cookieToken.substring(0, 20)}...`)
|
|
|
|
|
}
|
|
|
|
|
if (localToken) {
|
|
|
|
|
console.log(`[Auth] Local token length: ${localToken.length}`)
|
|
|
|
|
console.log(`[Auth] Local token preview: ${localToken.substring(0, 20)}...`)
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-30 21:25:26 +03:00
|
|
|
|
return isAuth
|
|
|
|
|
}
|