mirror of
https://github.com/dream-pep/koring-launcher.git
synced 2026-09-12 05:45:18 +08:00
114 lines
3.4 KiB
TypeScript
114 lines
3.4 KiB
TypeScript
import electron from 'electron';
|
|||
|
|
const { ipcMain } = electron;
|
||
|
|
import {
|
||
|
|
requestDeviceCode,
|
||
|
|
pollForTokenOnce,
|
||
|
|
refreshAccessToken,
|
||
|
|
saveKoringAuth,
|
||
|
|
readKoringAuth,
|
||
|
|
deleteKoringAuth,
|
||
|
|
} from '../core/koring-auth';
|
||
|
|
import { loadConfig, saveConfig } from '../config';
|
||
|
|
|
||
|
|
export function registerKoringAuthHandlers() {
|
||
|
|
ipcMain.handle('koring-auth:request-device-code', async () => {
|
||
|
|
try {
|
||
|
|
const result = await requestDeviceCode();
|
||
|
|
return { success: true, data: result, error: null };
|
||
|
|
} catch (e: unknown) {
|
||
|
|
return { success: false, data: null, error: String(e) };
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
ipcMain.handle('koring-auth:poll-token', async (_event, deviceCode: string) => {
|
||
|
|
try {
|
||
|
|
const result = await pollForTokenOnce(deviceCode);
|
||
|
|
const user = saveKoringAuth(result);
|
||
|
|
|
||
|
|
// 同时写入配置文件
|
||
|
|
try {
|
||
|
|
const config = loadConfig();
|
||
|
|
(config as any).koringUser = {
|
||
|
|
sub: user.sub,
|
||
|
|
name: user.name,
|
||
|
|
username: user.username,
|
||
|
|
email: user.email,
|
||
|
|
picture: user.picture,
|
||
|
|
accessToken: result.access_token,
|
||
|
|
refreshToken: result.refresh_token,
|
||
|
|
};
|
||
|
|
saveConfig(config);
|
||
|
|
} catch (e) {
|
||
|
|
console.error('[koring-auth] failed to save user to config:', e);
|
||
|
|
}
|
||
|
|
|
||
|
|
return { success: true, data: { user }, error: null };
|
||
|
|
} catch (e: unknown) {
|
||
|
|
const msg = e instanceof Error ? e.message : String(e);
|
||
|
|
return { success: false, data: null, error: msg };
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
ipcMain.handle('koring-auth:refresh', async () => {
|
||
|
|
try {
|
||
|
|
const stored = readKoringAuth();
|
||
|
|
if (!stored?.refresh_token) throw new Error('No refresh token');
|
||
|
|
const result = await refreshAccessToken(stored.refresh_token);
|
||
|
|
const user = saveKoringAuth(result);
|
||
|
|
|
||
|
|
// 同步到配置文件
|
||
|
|
try {
|
||
|
|
const config = loadConfig();
|
||
|
|
(config as any).koringUser = {
|
||
|
|
sub: user.sub,
|
||
|
|
name: user.name,
|
||
|
|
username: user.username,
|
||
|
|
email: user.email,
|
||
|
|
picture: user.picture,
|
||
|
|
accessToken: result.access_token,
|
||
|
|
refreshToken: result.refresh_token,
|
||
|
|
};
|
||
|
|
saveConfig(config);
|
||
|
|
} catch {}
|
||
|
|
|
||
|
|
return { success: true, data: { user }, error: null };
|
||
|
|
} catch (e: unknown) {
|
||
|
|
return { success: false, data: null, error: String(e) };
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
ipcMain.handle('koring-auth:get-user', () => {
|
||
|
|
try {
|
||
|
|
const stored = readKoringAuth();
|
||
|
|
// 也从配置文件读取
|
||
|
|
if (!stored?.user?.sub) {
|
||
|
|
try {
|
||
|
|
const config = loadConfig();
|
||
|
|
const ku = (config as any).koringUser;
|
||
|
|
if (ku?.sub) {
|
||
|
|
return { success: true, data: { user: ku, access_token: '', refresh_token: '', id_token: '', expires_at: 0 }, error: null };
|
||
|
|
}
|
||
|
|
} catch {}
|
||
|
|
}
|
||
|
|
return { success: true, data: stored, error: null };
|
||
|
|
} catch (e: unknown) {
|
||
|
|
return { success: false, data: null, error: String(e) };
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
ipcMain.handle('koring-auth:logout', () => {
|
||
|
|
try {
|
||
|
|
deleteKoringAuth();
|
||
|
|
// 清除配置文件中的用户数据
|
||
|
|
try {
|
||
|
|
const config = loadConfig();
|
||
|
|
delete (config as any).koringUser;
|
||
|
|
saveConfig(config);
|
||
|
|
} catch {}
|
||
|
|
return { success: true, data: null, error: null };
|
||
|
|
} catch (e: unknown) {
|
||
|
|
return { success: false, data: null, error: String(e) };
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|