spa-csrf-fix
Some checks failed
Deploy on push / deploy (push) Failing after 4s

This commit is contained in:
2025-07-25 09:42:43 +03:00
parent e0f6b7d2be
commit 0bccd0d87e
6 changed files with 150 additions and 248 deletions

View File

@@ -1,4 +1,4 @@
import { Component, createContext, createSignal, JSX, useContext } from 'solid-js'
import { Component, createContext, createSignal, JSX, onMount, useContext } from 'solid-js'
import { query } from '../graphql'
import { ADMIN_LOGIN_MUTATION, ADMIN_LOGOUT_MUTATION } from '../graphql/mutations'
import {
@@ -45,12 +45,14 @@ export {
interface AuthContextType {
isAuthenticated: () => boolean
isReady: () => boolean
login: (username: string, password: string) => Promise<void>
logout: () => Promise<void>
}
const AuthContext = createContext<AuthContextType>({
isAuthenticated: () => false,
isReady: () => false,
login: async () => {},
logout: async () => {}
})
@@ -64,10 +66,27 @@ interface AuthProviderProps {
export const AuthProvider: Component<AuthProviderProps> = (props) => {
console.log('[AuthProvider] Initializing...')
const [isAuthenticated, setIsAuthenticated] = createSignal(checkAuthStatus())
const [isReady, setIsReady] = createSignal(false)
console.log(
`[AuthProvider] Initial auth state: ${isAuthenticated() ? 'authenticated' : 'not authenticated'}`
)
// Инициализация авторизации при монтировании
onMount(async () => {
console.log('[AuthProvider] Performing auth initialization...')
// Небольшая задержка для завершения других инициализаций
await new Promise((resolve) => setTimeout(resolve, 100))
// Проверяем текущее состояние авторизации
const authStatus = checkAuthStatus()
setIsAuthenticated(authStatus)
console.log('[AuthProvider] Auth initialization complete, ready for requests')
setIsReady(true)
})
const login = async (username: string, password: string) => {
console.log('[AuthProvider] Attempting login...')
try {
@@ -127,6 +146,7 @@ export const AuthProvider: Component<AuthProviderProps> = (props) => {
const value: AuthContextType = {
isAuthenticated,
isReady,
login,
logout
}

View File

@@ -6,6 +6,7 @@ import {
GET_COMMUNITIES_QUERY,
GET_TOPICS_QUERY
} from '../graphql/queries'
import { useAuth } from './auth'
export interface Community {
id: number
@@ -92,6 +93,7 @@ const DataContext = createContext<DataContextType>({
const COMMUNITY_STORAGE_KEY = 'admin-selected-community'
export function DataProvider(props: { children: JSX.Element }) {
const auth = useAuth()
const [communities, setCommunities] = createSignal<Community[]>([])
const [topics, setTopics] = createSignal<Topic[]>([])
const [allTopics, setAllTopics] = createSignal<Topic[]>([])
@@ -140,11 +142,16 @@ export function DataProvider(props: { children: JSX.Element }) {
// Эффект для загрузки ролей при изменении сообщества
createEffect(() => {
const community = selectedCommunity()
if (community !== null) {
console.log('[DataProvider] Загрузка ролей для сообщества:', community)
const isReady = auth.isReady()
const isAuthenticated = auth.isAuthenticated()
if (community !== null && isReady && isAuthenticated) {
console.log('[DataProvider] Auth ready, загрузка ролей для сообщества:', community)
loadRoles(community).catch((err) => {
console.warn('Не удалось загрузить роли для сообщества:', err)
})
} else if (!isReady) {
console.log('[DataProvider] Ожидание готовности авторизации перед загрузкой ролей')
}
})
@@ -324,6 +331,26 @@ export function DataProvider(props: { children: JSX.Element }) {
// biome-ignore lint/suspicious/noExplicitAny: grahphql
queryGraphQL: async (queryStr: string, variables?: Record<string, any>) => {
try {
// Ждем готовности авторизации перед выполнением запроса
const maxWaitTime = 5000 // 5 секунд максимум
const startTime = Date.now()
while (!auth.isReady() && Date.now() - startTime < maxWaitTime) {
console.log('[DataProvider] Ожидание готовности авторизации для GraphQL запроса...')
await new Promise((resolve) => setTimeout(resolve, 50))
}
if (!auth.isReady()) {
console.warn('[DataProvider] Таймаут ожидания готовности авторизации')
throw new Error('Auth not ready')
}
if (!auth.isAuthenticated()) {
console.warn('[DataProvider] Пользователь не авторизован')
throw new Error('User not authenticated')
}
console.log('[DataProvider] Выполнение GraphQL запроса после готовности авторизации')
return await query(`${location.origin}/graphql`, queryStr, variables)
} catch (error) {
console.error('Ошибка выполнения GraphQL запроса:', error)