コンテンツへ移動

@xid-kit/electron

メインプロセス PKCE フロー、contextBridge プリロード、OS キーチェーントークンストレージ、ループバックまたはカスタムスキームコールバック戦略を備えた Electron SDK。

Markdown で表示

状態

Registry 状態: UNPUBLISHED。この SDK はリポジトリのソース checkout からのみインストールし、外部 package registry は使用しないでください。

パッケージステータス:現行パッケージ。メインプロセスアプリ、contextBridge プリロード、レンダラー側ブリッジが実装済みです。本番インフラでの実際の IdP ラウンドトリップはまだ手動検証待ちです。

エントリーポイント

エントリー 目的
@xid-kit/electron デフォルトエクスポート:レンダラーサーフェスと型
@xid-kit/electron/main メインプロセス専用:XidElectronApp
@xid-kit/electron/renderer レンダラープロセス:getXidBridge、XidClient
@xid-kit/electron/preload window.xidBridge を公開する既製のプリロードスクリプト

メインプロセスセットアップ

// 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.ts
import '@xid-kit/electron/preload'
// Exposes window.xidBridge with storage, signIn, signOut,
// getAccessToken, getSession, setTokenStorage

レンダラープロセス

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

カスタムスキーム(ループバックの代替)

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

トークンストレージ

  • トークンは safeStorage.encryptString()(OS キーチェーン)で暗号化され、デフォルトで app.getPath('userData')/xid-tokens/ にバイナリファイルとして保存されます。
  • safeStorage.isEncryptionAvailable()false(キーリングのないヘッドレス Linux)を返す場合、setItem() は平文を黙って書き込む代わりにコード encryption_unavailableElectronStorageError をスローします。
  • XidElectronMainOptionsstorageDir でストレージディレクトリを上書きします。

共有ネイティブコントラクト

方式 説明
signIn(options?) システムブラウザを開き、コードを交換してトークンを保存します
signOut() ローカルトークンをクリアします
getAccessToken() refresh を行わずに、現在の有効期限内の access token を返します。有効期限切れのローカル state を消去した場合は null を返します。DPoP が実装されるまで SDK は offline_access を拒否します。
getSession() 現在の有効期限内の accessToken と expiresAt、または null を返します
ナビゲーション

入力して検索...

矢印キーで移動Enter キーで選択Escape キーで閉じる