Files
koring-launcher/electron/handlers/koring-auth.ts
T
dream_pep 3653e26a09 feat: 发布 v1.2.0 版本,新增多项核心功能
- 引入 electron-updater 实现自动更新功能
- 新增 Java 环境扫描与校验的 IPC 处理逻辑
- 实现离线账号登录功能
- 新增配置变更跨进程广播机制
- 重构游戏启动逻辑,使用主进程内存配置作为唯一权威来源
- 新增界面显示与语言设置的配置页面
- 添加 Windows 平台自动发布 CI 流水线
- 迁移旧版配置/认证文件到用户数据目录
- 修复崩溃日志路径、表单控件等多项 bug
- 重构设置页组件系统统一界面样式
2026-08-28 02:08:12 +08:00

112 lines
3.3 KiB
TypeScript

import electron from 'electron';
const { ipcMain } = electron;
import {
requestDeviceCode,
pollForTokenOnce,
refreshAccessToken,
saveKoringAuth,
readKoringAuth,
deleteKoringAuth,
} from '../core/koring-auth';
import { getConfig, updateConfig, deleteConfigKey } 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);
// 同步到配置文件(主进程权威模型:合并内存缓存 + debounce 写盘)
try {
updateConfig({
koringUser: {
sub: user.sub,
name: user.name,
username: user.username,
email: user.email,
picture: user.picture,
accessToken: result.access_token,
refreshToken: result.refresh_token,
},
});
} 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 {
updateConfig({
koringUser: {
sub: user.sub,
name: user.name,
username: user.username,
email: user.email,
picture: user.picture,
accessToken: result.access_token,
refreshToken: result.refresh_token,
},
});
} 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 = getConfig();
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 {
deleteConfigKey('koringUser');
} catch {}
return { success: true, data: null, error: null };
} catch (e: unknown) {
return { success: false, data: null, error: String(e) };
}
});
}