Zum Inhalt springen

@vonvon-kit/electron

Electron-SDK mit PKCE-Flow im Hauptprozess, contextBridge-Preload,OS-Keychain-Token-Speicherung und Loopback- oderCustom-Scheme-Callback-Strategien.

Als Markdown anzeigen

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
@vonvon-kit/electron Standardexport: Renderer-Oberfläche und Typen
@vonvon-kit/electron/main Nur Hauptprozess: VonvonElectronApp
@vonvon-kit/electron/renderer Renderer-Prozess: getVonvonBridge, VonvonClient
@vonvon-kit/electron/preload Vorgefertigtes Preload-Skript, das window.vonvonBridge verfügbar macht

Hauptprozess-Einrichtung

// main.ts
import { app, ipcMain } from 'electron'
import { VonvonElectronApp } from '@vonvon-kit/electron/main'

const vonvonApp = new VonvonElectronApp({
  issuer: 'https://vonvon.id',
  clientId: 'client_abc123',
  // callbackStrategy: 'loopback' (default, RFC 8252 s.7.3) | 'custom-scheme'
})

app.whenReady().then(async () => {
  await vonvonApp.init(ipcMain)
  const win = new BrowserWindow({
    webPreferences: {
      contextIsolation: true,
      preload: path.join(__dirname, 'preload.js'),
    },
  })
  win.on('closed', () => vonvonApp.dispose(ipcMain))
})

Preload-Skript

// preload.ts
import '@vonvon-kit/electron/preload'
// Exposes window.vonvonBridge with storage, signIn, signOut,
// getAccessToken, getSession, setTokenStorage

Renderer-Prozess

import { getVonvonBridge } from '@vonvon-kit/electron/renderer'

const bridge = getVonvonBridge()

// 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 { VonvonElectronApp } from '@vonvon-kit/electron/main'

app.setAsDefaultProtocolClient('myapp')

const vonvonApp = new VonvonElectronApp({
  issuer: 'https://vonvon.id',
  clientId: 'client_abc123',
  callbackStrategy: 'custom-scheme',
  customScheme: 'myapp',  // redirect_uri = myapp://callback
})

vonvonApp.registerDeepLinkHandler(app)

Token-Speicher

  • Tokens werden mit safeStorage.encryptString() (OS-Keychain)verschlüsselt und standardmäßig als Binärdateien inapp.getPath('userData')/vonvon-tokens/ gespeichert.
  • Wenn safeStorage.isEncryptionAvailable() false zurückgibt(headless Linux ohne Keyring), löst setItem() einenElectronStorageError mit Code encryption_unavailable aus,anstatt stillschweigend Klartext zu schreiben.
  • Das Speicherverzeichnis mit storageDir inVonvonElectronMainOptions ü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
Navigation

Suchbegriff eingeben...

Mit den Pfeiltasten navigierenEingabetaste zum AuswählenEscape zum Schließen