Ir para o conteúdo

@xid-kit/electron

SDK Electron com fluxo PKCE no processo principal, preload viacontextBridge, armazenamento de tokens no keychain do SO eestratégias de callback loopback ou esquema personalizado.

Ver como Markdown

Estado

O status do pacote é Pacote atual. App do processo principal,preload via contextBridge e bridge do lado do renderer estãoimplementados. Uma ida e volta real com o IdP em infraestrutura deprodução ainda está pendente de verificação manual.

Pontos de entrada

Entry Finalidade
@xid-kit/electron Export padrão: superfície de renderer e tipos
@xid-kit/electron/main Somente processo principal: XidElectronApp
@xid-kit/electron/renderer Processo de renderer: getXidBridge, XidClient
@xid-kit/electron/preload Script de preload pronto que expõe window.xidBridge

Configuração do processo 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 preload

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

Processo de renderer

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 current access token (transparently refreshes if near expiry).
const token = await bridge.getAccessToken() // null when not signed in

// Get full session (accessToken + expiresAt in epoch seconds).
const session = await bridge.getSession()

// Sign out and clear tokens.
await bridge.signOut()

Esquema personalizado (alternativa ao 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)

Armazenamento de tokens

  • Os tokens são criptografados com safeStorage.encryptString()(keychain do SO) e armazenados como arquivos binários emapp.getPath('userData')/xid-tokens/ por padrão.
  • Se safeStorage.isEncryptionAvailable() retornar false(Linux headless sem keyring), setItem() lançaElectronStorageError com código encryption_unavailableem vez de gravar texto simples silenciosamente.
  • Substitua o diretório de armazenamento com storageDir emXidElectronMainOptions.

Contrato nativo compartilhado

Método Descrição
signIn(options?) Abre o navegador do sistema, troca o código, armazena os tokens
signOut() Limpa os tokens locais
getAccessToken() Retorna o token atual (atualiza se próximo da expiração); null sedesconectado
getSession() Retorna accessToken e expiresAt, ou null
Navegação

Digite para pesquisar...

Use as teclas de seta para navegarPressione Enter para selecionarPressione Escape para fechar