Zustand
Registry-Status: UNPUBLISHED. Installieren Sie dieses SDK nur aus einem Checkout des Repository-Quellcodes; verwenden Sie keine externe Paket-Registry.
Paketstatus: Aktuelles Paket. Hauptprozess-App,contextBridge-Preload und renderer-seitige Bridge sind implementiert. Einechter IdP-Round-Trip auf Produktionsinfrastruktur steht noch manuell aus.
Einstiegspunkte
| Eintrag | Zweck |
|---|---|
@xid-kit/electron |
Standardexport: Renderer-Oberfläche und Typen |
@xid-kit/electron/main |
Nur Hauptprozess: XidElectronApp |
@xid-kit/electron/renderer |
Renderer-Prozess: getXidBridge, XidClient |
@xid-kit/electron/preload |
Vorgefertigtes Preload-Skript, das window.xidBridge verfügbar macht |
Hauptprozess-Einrichtung
// main.ts
import { app, ipcMain } from 'electron'
import { XidElectronApp } from '@xid-kit/electron/main'
const xidApp = new XidElectronApp({
issuer: 'https://xid.dev',
clientId: 'client_abc123',
// callbackStrategy: 'loopback' (default, RFC 8252 s.7.3) | 'custom-scheme'
})
app.whenReady().then(async () => {
await xidApp.init(ipcMain)
const win = new BrowserWindow({
webPreferences: {
contextIsolation: true,
preload: path.join(__dirname, 'preload.js'),
},
})
win.on('closed', () => xidApp.dispose(ipcMain))
})Preload-Skript
// preload.ts
import '@xid-kit/electron/preload'
// Exposes window.xidBridge with storage, signIn, signOut,
// getAccessToken, getSession, setTokenStorageRenderer-Prozess
import { getXidBridge } from '@xid-kit/electron/renderer'
const bridge = getXidBridge()
// Opens system browser, waits for loopback callback, exchanges code.
const accessToken = await bridge.signIn()
// Get the current unexpired access token. Expiry requires a new sign-in.
const token = await bridge.getAccessToken() // null when signed out or expired
// Get the current unexpired session (accessToken + expiresAt in epoch seconds).
const session = await bridge.getSession()
// Clear local tokens. No refresh or revoke request is sent.
await bridge.signOut()Benutzerdefiniertes Schema (Alternative zu Loopback)
// main.ts
import { app } from 'electron'
import { XidElectronApp } from '@xid-kit/electron/main'
app.setAsDefaultProtocolClient('myapp')
const xidApp = new XidElectronApp({
issuer: 'https://xid.dev',
clientId: 'client_abc123',
callbackStrategy: 'custom-scheme',
customScheme: 'myapp', // redirect_uri = myapp://callback
})
xidApp.registerDeepLinkHandler(app)Token-Speicher
- Tokens werden mit
safeStorage.encryptString()(OS-Keychain)verschlüsselt und standardmäßig als Binärdateien inapp.getPath('userData')/xid-tokens/gespeichert. - Wenn
safeStorage.isEncryptionAvailable()falsezurückgibt(headless Linux ohne Keyring), löstsetItem()einenElectronStorageErrormit Codeencryption_unavailableaus,anstatt stillschweigend Klartext zu schreiben. - Das Speicherverzeichnis mit
storageDirinXidElectronMainOptionsüberschreiben.
Gemeinsamer nativer Vertrag
| Methode | Beschreibung |
|---|---|
signIn(options?) |
Öffnet Systembrowser, tauscht Code ein, speichert Tokens |
signOut() |
Löscht lokale Tokens |
getAccessToken() |
Gibt das aktuelle, nicht abgelaufene Zugriffstoken ohne Refresh zurück; löscht abgelaufenen lokalen Status und gibt null zurück. Das SDK lehnt offline_access ab, bis DPoP implementiert ist. |
getSession() |
Gibt den aktuellen, nicht abgelaufenen accessToken und expiresAt oder null zurück |