Files
core/panel/utils/auth.ts
Untone fb98a1c6c8
All checks were successful
Deploy on push / deploy (push) Successful in 4m32s
[0.9.28] - OAuth/Auth with httpOnly cookie
2025-09-28 12:22:37 +03:00

110 lines
4.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Утилиты для работы с токенами авторизации
* @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...')
// 💋 НЕ проверяем httpOnly cookie через JavaScript - он недоступен!
// httpOnly cookie автоматически отправляется браузером, но недоступен для чтения
// Проверяем наличие токена в localStorage
const localToken = localStorage.getItem(AUTH_TOKEN_KEY)
const hasLocalToken = !!localToken && localToken.length > 10
// 💋 Для httpOnly cookie полагаемся на backend проверку
// Если нет токена в localStorage, считаем что пользователь может быть авторизован через httpOnly cookie
// Окончательная проверка произойдет при первом GraphQL запросе
const isAuth = hasLocalToken
console.log(`[Auth] Local token: ${hasLocalToken ? 'present' : 'missing'}`)
console.log(
`[Auth] Authentication status: ${isAuth ? 'authenticated via localStorage' : 'unknown (may be authenticated via httpOnly cookie)'}`
)
// Дополнительное логирование для диагностики
if (localToken) {
console.log(`[Auth] Local token length: ${localToken.length}`)
console.log(`[Auth] Local token preview: ${localToken.substring(0, 20)}...`)
}
return isAuth
}