99 lines
2.7 KiB
TypeScript
99 lines
2.7 KiB
TypeScript
import { YggdrasilClient, YggrasilAuthentication } from '@xmcl/user';
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
import { API_BASE_URL } from '../renderer/api';
|
|
|
|
// Ely.by сервер
|
|
const ELY_BY_AUTH_SERVER = API_BASE_URL;
|
|
|
|
export class AuthService {
|
|
private client: YggdrasilClient;
|
|
|
|
constructor() {
|
|
this.client = new YggdrasilClient(ELY_BY_AUTH_SERVER);
|
|
}
|
|
|
|
async login(
|
|
username: string,
|
|
password: string,
|
|
): Promise<YggrasilAuthentication> {
|
|
try {
|
|
// Генерируем уникальный clientToken
|
|
const clientToken = uuidv4();
|
|
|
|
// Выполняем запрос напрямую к правильному URL
|
|
const response = await fetch(`${ELY_BY_AUTH_SERVER}/auth/authenticate`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({
|
|
username,
|
|
password,
|
|
clientToken,
|
|
requestUser: true,
|
|
}),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
let detail = '';
|
|
try {
|
|
const data = await response.json(); // FastAPI: { detail: "..." }
|
|
detail = data?.detail || '';
|
|
} catch {
|
|
detail = await response.text();
|
|
}
|
|
throw new Error(detail || `HTTP ${response.status}`);
|
|
}
|
|
|
|
const auth = await response.json();
|
|
console.log(`Аутентификация успешна для ${auth.selectedProfile?.name}`);
|
|
return auth;
|
|
} catch (error) {
|
|
console.error('Ошибка при авторизации:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async validate(accessToken: string, clientToken: string): Promise<boolean> {
|
|
try {
|
|
console.log(accessToken, clientToken);
|
|
const response = await fetch(`${ELY_BY_AUTH_SERVER}/auth/validate`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({ accessToken, clientToken }),
|
|
});
|
|
|
|
return response.ok;
|
|
} catch (error) {
|
|
console.error('Ошибка при валидации токена:', error);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
async refresh(
|
|
accessToken: string,
|
|
clientToken: string,
|
|
): Promise<YggrasilAuthentication | null> {
|
|
try {
|
|
const response = await fetch(`${ELY_BY_AUTH_SERVER}/auth/refresh`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({ accessToken, clientToken }),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
return null;
|
|
}
|
|
|
|
return await response.json();
|
|
} catch (error) {
|
|
console.error('Ошибка при обновлении токена:', error);
|
|
return null;
|
|
}
|
|
}
|
|
}
|