feat: your authorization
This commit is contained in:
@ -2,7 +2,7 @@ import { YggdrasilClient, YggrasilAuthentication } from '@xmcl/user';
|
|||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
|
|
||||||
// Ely.by сервер
|
// Ely.by сервер
|
||||||
const ELY_BY_AUTH_SERVER = 'https://authserver.ely.by';
|
const ELY_BY_AUTH_SERVER = 'http://127.0.0.1:8000';
|
||||||
|
|
||||||
export class AuthService {
|
export class AuthService {
|
||||||
private client: YggdrasilClient;
|
private client: YggdrasilClient;
|
||||||
@ -49,6 +49,7 @@ export class AuthService {
|
|||||||
|
|
||||||
async validate(accessToken: string, clientToken: string): Promise<boolean> {
|
async validate(accessToken: string, clientToken: string): Promise<boolean> {
|
||||||
try {
|
try {
|
||||||
|
console.log(accessToken, clientToken);
|
||||||
const response = await fetch(`${ELY_BY_AUTH_SERVER}/auth/validate`, {
|
const response = await fetch(`${ELY_BY_AUTH_SERVER}/auth/validate`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
|
@ -479,7 +479,7 @@ export function initMinecraftHandlers() {
|
|||||||
username,
|
username,
|
||||||
memory = 4096,
|
memory = 4096,
|
||||||
baseVersion = '1.21.4',
|
baseVersion = '1.21.4',
|
||||||
fabricVersion = 'fabric0.16.14',
|
fabricVersion = '0.16.14',
|
||||||
packName = 'Comfort', // Название основной сборки
|
packName = 'Comfort', // Название основной сборки
|
||||||
versionToLaunchOverride = '', // Возможность переопределить версию для запуска
|
versionToLaunchOverride = '', // Возможность переопределить версию для запуска
|
||||||
serverIp = 'popa-popa.ru',
|
serverIp = 'popa-popa.ru',
|
||||||
@ -499,6 +499,8 @@ export function initMinecraftHandlers() {
|
|||||||
// Найти версию пакета, Fabric или базовую версию
|
// Найти версию пакета, Fabric или базовую версию
|
||||||
let versionToLaunch = versionToLaunchOverride;
|
let versionToLaunch = versionToLaunchOverride;
|
||||||
|
|
||||||
|
console.log('fabric:', `${baseVersion}-fabric${fabricVersion}`);
|
||||||
|
|
||||||
if (!versionToLaunch) {
|
if (!versionToLaunch) {
|
||||||
if (
|
if (
|
||||||
versionsContents.includes(`${baseVersion}-fabric${fabricVersion}`)
|
versionsContents.includes(`${baseVersion}-fabric${fabricVersion}`)
|
||||||
@ -598,6 +600,11 @@ export function initMinecraftHandlers() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 2. Устанавливаем Fabric
|
// 2. Устанавливаем Fabric
|
||||||
|
console.log('Попытка установки Fabric:', {
|
||||||
|
minecraftVersion: baseVersion,
|
||||||
|
fabricVersion: fabricVersion,
|
||||||
|
minecraftDir: minecraftDir,
|
||||||
|
});
|
||||||
try {
|
try {
|
||||||
event.sender.send('installation-status', {
|
event.sender.send('installation-status', {
|
||||||
step: 'fabric-list',
|
step: 'fabric-list',
|
||||||
@ -733,8 +740,13 @@ export function initMinecraftHandlers() {
|
|||||||
server: serverConfig, // Используем созданный объект конфигурации
|
server: serverConfig, // Используем созданный объект конфигурации
|
||||||
extraJVMArgs: [
|
extraJVMArgs: [
|
||||||
'-Dlog4j2.formatMsgNoLookups=true',
|
'-Dlog4j2.formatMsgNoLookups=true',
|
||||||
`-javaagent:${authlibPath}=ely.by`,
|
`-javaagent:${authlibPath}=http://147.78.65.214:8000`,
|
||||||
`-Xmx${memory}M`,
|
`-Xmx${memory}M`,
|
||||||
|
'-Dauthlibinjector.skinWhitelist=127.0.0.1,falrfg-213-87-196-173.ru.tuna.am',
|
||||||
|
'-Dauthlibinjector.debug=verbose,authlib',
|
||||||
|
'-Dauthlibinjector.legacySkinPolyfill=enabled',
|
||||||
|
'-Dauthlibinjector.mojangAntiFeatures=disabled',
|
||||||
|
'-Dcom.mojang.authlib.disableSecureProfileEndpoints=true',
|
||||||
],
|
],
|
||||||
// Используем данные аутентификации Yggdrasil
|
// Используем данные аутентификации Yggdrasil
|
||||||
accessToken,
|
accessToken,
|
||||||
@ -924,22 +936,18 @@ export function initAuthHandlers() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Валидация токена
|
// Валидация токена
|
||||||
ipcMain.handle('validate-token', async (event, accessToken) => {
|
ipcMain.handle(
|
||||||
|
'validate-token',
|
||||||
|
async (event, { accessToken, clientToken }) => {
|
||||||
try {
|
try {
|
||||||
const clientToken = JSON.parse(
|
|
||||||
fs.readFileSync(
|
|
||||||
path.join(app.getPath('userData'), 'config.json'),
|
|
||||||
'utf8',
|
|
||||||
),
|
|
||||||
).clientToken;
|
|
||||||
|
|
||||||
const valid = await authService.validate(accessToken, clientToken);
|
const valid = await authService.validate(accessToken, clientToken);
|
||||||
return { valid };
|
return { valid };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Ошибка валидации токена:', error);
|
console.error('Ошибка валидации токена:', error);
|
||||||
return { valid: false };
|
return { valid: false };
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
// Обновление токена
|
// Обновление токена
|
||||||
ipcMain.handle(
|
ipcMain.handle(
|
||||||
|
@ -26,7 +26,10 @@ const AuthCheck = ({ children }: { children: ReactNode }) => {
|
|||||||
const config = JSON.parse(savedConfig);
|
const config = JSON.parse(savedConfig);
|
||||||
if (config.accessToken) {
|
if (config.accessToken) {
|
||||||
// Можно добавить дополнительную проверку токена
|
// Можно добавить дополнительную проверку токена
|
||||||
const isValid = await validateToken(config.accessToken);
|
const isValid = await validateToken(
|
||||||
|
config.accessToken,
|
||||||
|
config.clientToken,
|
||||||
|
);
|
||||||
setIsAuthenticated(isValid);
|
setIsAuthenticated(isValid);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -41,12 +44,12 @@ const AuthCheck = ({ children }: { children: ReactNode }) => {
|
|||||||
checkAuth();
|
checkAuth();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const validateToken = async (token: string) => {
|
const validateToken = async (accessToken: string, clientToken: string) => {
|
||||||
try {
|
try {
|
||||||
// Используем IPC для валидации токена через main процесс
|
// Используем IPC для валидации токена через main процесс
|
||||||
const result = await window.electron.ipcRenderer.invoke(
|
const result = await window.electron.ipcRenderer.invoke(
|
||||||
'validate-token',
|
'validate-token',
|
||||||
token,
|
{ accessToken, clientToken },
|
||||||
);
|
);
|
||||||
|
|
||||||
// Если токен недействителен, очищаем сохраненные данные в localStorage
|
// Если токен недействителен, очищаем сохраненные данные в localStorage
|
||||||
|
Reference in New Issue
Block a user