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

Status do registry: UNPUBLISHED. Instale este SDK somente a partir do checkout do código-fonte do repositório; não use um registry de pacotes externo.

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

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 de acesso atual não expirado sem renovação; limpa o estado local expirado e retorna null. O SDK rejeita offline_access até que DPoP seja implementado.
getSession() Retorna os valores atuais accessToken e expiresAt se o token não tiver expirado, ou null
Navegação

Digite para pesquisar...

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