Aller au contenu

@xid-kit/electron

SDK Electron avec flux PKCE dans le processus principal, preloadcontextBridge, stockage des jetons dans le trousseau OS et stratégies decallback loopback ou schéma personnalisé.

Afficher en Markdown

Statut

Statut du registre : UNPUBLISHED. Installez ce SDK uniquement depuis un checkout du code source du dépôt ; n’utilisez pas de registre de paquets externe.

Le statut du package est Package actuel. L’application du processusprincipal, le preload contextBridge et le pont côté rendu sontimplémentés. Un aller-retour réel avec un IdP sur une infrastructure deproduction est en attente de vérification manuelle.

Points d’entrée

Entrée Objectif
@xid-kit/electron Export par défaut : surface de rendu et types
@xid-kit/electron/main Processus principal uniquement : XidElectronApp
@xid-kit/electron/renderer Processus de rendu : getXidBridge, XidClient
@xid-kit/electron/preload Script de préchargement prêt à l’emploi qui expose window.xidBridge

Configuration du processus principal

// 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))
})

Script de préchargement

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

Processus de rendu

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()

Schéma personnalisé (alternative au 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)

Stockage des jetons

  • Les jetons sont chiffrés avec safeStorage.encryptString()(trousseau OS) et stockés sous forme de fichiers binaires dansapp.getPath('userData')/xid-tokens/ par défaut.
  • Si safeStorage.isEncryptionAvailable() retourne false (Linuxheadless sans trousseau), setItem() lèveElectronStorageError avec le code encryption_unavailableplutôt que d’écrire en clair silencieusement.
  • Remplacer le répertoire de stockage avec storageDir dansXidElectronMainOptions.

Contrat natif commun

Méthode Description
signIn(options?) Ouvre le navigateur système, échange le code, stocke les jetons
signOut() Efface les jetons locaux
getAccessToken() Retourne le jeton d’accès actuel non expiré sans renouvellement; efface l’état local expiré et retourne null. Le SDK rejette offline_access tant que DPoP n’est pas implémenté.
getSession() Retourne les valeurs actuelles accessToken et expiresAt si le jeton n’est pas expiré, ou null
Navigation

Saisissez votre recherche...

Utilisez les touches fléchées pour naviguerAppuyez sur Entrée pour sélectionnerAppuyez sur Échap pour fermer