test fix authorization

This commit is contained in:
2025-12-16 17:09:51 +05:00
parent c15c36891e
commit 70ec57d6fb
4 changed files with 277 additions and 145 deletions

View File

@ -1,83 +1,45 @@
import { useState } from 'react';
interface AuthSession {
accessToken: string;
clientToken: string;
selectedProfile: {
id: string;
name: string;
};
}
import {
authenticate,
validateToken,
refreshToken,
type AuthSession,
} from '../api';
export default function useAuth() {
const [status, setStatus] = useState('idle');
const [status, setStatus] = useState<
'idle' | 'validating' | 'refreshing' | 'authenticating' | 'error'
>('idle');
// Проверка валидности токена
const validateSession = async (accessToken: string): Promise<boolean> => {
try {
setStatus('validating');
const response = await window.electron.ipcRenderer.invoke(
'validate-token',
accessToken,
);
setStatus('idle');
return response.valid;
} catch (error) {
console.error('Ошибка при валидации токена:', error);
setStatus('error');
return false;
}
};
// Обновление токена
const refreshSession = async (
accessToken: string,
clientToken: string,
): Promise<AuthSession | null> => {
try {
setStatus('refreshing');
const response = await window.electron.ipcRenderer.invoke(
'refresh-token',
{ accessToken, clientToken },
);
setStatus('idle');
return response;
} catch (error) {
console.error('Ошибка при обновлении токена:', error);
setStatus('error');
return null;
}
};
// Аутентификация в Ely.by
const authenticateWithElyBy = async (
// Аутентификация (HTTP напрямую, без IPC!)
const authenticateUser = async (
username: string,
password: string,
saveConfigFunc: Function,
saveConfigFunc: (config: any) => void,
): Promise<AuthSession | null> => {
try {
setStatus('authenticating');
const response = await window.electron.ipcRenderer.invoke(
'authenticate',
{ username, password },
);
if (response && response.accessToken) {
// Правильно сохраняем данные в конфигурации
saveConfigFunc({
username: response.selectedProfile.name, // Имя игрока как строка
uuid: response.selectedProfile.id,
accessToken: response.accessToken,
clientToken: response.clientToken,
memory: 4096, // Сохраняем значение по умолчанию или из предыдущей конфигурации
});
// Прямой HTTP-запрос к вашему серверу
const session = await authenticate(username, password);
setStatus('authenticated');
return response;
}
// Сохраняем в конфигурацию
saveConfigFunc({
username: session.selectedProfile.name,
uuid: session.selectedProfile.id,
accessToken: session.accessToken,
clientToken: session.clientToken,
memory: 4096,
});
setStatus('error');
return null;
// Уведомляем Electron (для запуска Minecraft)
await window.electron.ipcRenderer.invoke('auth-changed', {
isAuthed: true,
minecraftSession: session, // Передаём всю сессию
});
setStatus('authenticating');
return session;
} catch (error) {
console.error('Ошибка при аутентификации:', error);
setStatus('error');
@ -85,10 +47,53 @@ export default function useAuth() {
}
};
// Валидация токена (HTTP напрямую)
const validateSession = async (accessToken: string): Promise<boolean> => {
try {
setStatus('validating');
// Получаем clientToken из localStorage
const savedConfig = localStorage.getItem('launcher_config');
if (!savedConfig) return false;
const config = JSON.parse(savedConfig);
// Прямой HTTP-запрос на валидацию
const isValid = await validateToken(accessToken, config.clientToken);
setStatus('idle');
return isValid;
} catch (error) {
console.error('Ошибка при валидации токена:', error);
setStatus('error');
return false;
}
};
// Обновление токена (HTTP напрямую)
const refreshSession = async (
accessToken: string,
clientToken: string,
): Promise<AuthSession | null> => {
try {
setStatus('refreshing');
// Прямой HTTP-запрос на обновление
const session = await refreshToken(accessToken, clientToken);
setStatus('idle');
return session;
} catch (error) {
console.error('Ошибка при обновлении токена:', error);
setStatus('error');
return null;
}
};
return {
status,
authenticateUser,
validateSession,
refreshSession,
authenticateWithElyBy,
};
}