Ir para o conteúdo

@xid-kit/tauri

SDK desktop Tauri v2 com fluxo PKCE S256, manipulador de callback dedeeplink, adaptador de keychain do SO e template de plugin Rust.

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. Bridge JS, fluxo PKCE S256,manipulador de callback de deeplink, adaptador de keychain do SO etemplate de plugin Rust estão implementados. Uma ida e volta real como IdP em infraestrutura de produção ainda está pendente deverificação manual.

Configuração do Tauri

// tauri.conf.json
{
  "bundle": { "identifier": "com.example.myapp" },
  "plugins": {
    "deep-link": { "desktop": { "schemes": ["myapp"] } }
  }
}

Plugin Rust

Copie templates/xid-keychain-plugin.rs parasrc-tauri/src/xid_keychain.rs e registre-o seguindotemplates/tauri-app-setup.rs. Adicione keyring =\"2\", tauri-plugin-deep-link = \"2\" etauri-plugin-shell = \"2\" ao src-tauri/Cargo.toml.

Integração JS

import { createXidTauriClient, createTauriKeychainAdapter } from '@xid-kit/tauri'
import { invoke } from '@tauri-apps/api/core'
import { open } from '@tauri-apps/plugin-shell'
import { onOpenUrl } from '@tauri-apps/plugin-deep-link'

const client = createXidTauriClient({
  issuer: 'https://xid.dev',
  clientId: 'YOUR_CLIENT_ID',
  redirectUri: 'myapp://auth/callback',
  keychain: createTauriKeychainAdapter({ invoke }),
})

// Register deeplink handler (e.g. on App component mount)
await onOpenUrl(async (urls) => {
  for (const url of urls) await client.handleRedirect(url)
})

// Trigger sign-in: opens system browser
await client.signIn({ openUrl: open })

Obtenção de token e logout

// Get the current unexpired access token. Expiry requires a new sign-in.
const token = await client.getAccessToken()

// Get the current unexpired session (userId, organizationId, expiresAt).
const session = await client.getSession()

// Clear local keychain state. No refresh or revoke request is sent.
await client.signOut()

// To request full IdP sign-out, open an explicit OIDC RP-initiated logout URL.
const logoutUrl = client.buildSignOutUrl({ postLogoutRedirectUri: 'myapp://logout' })
await open(logoutUrl.toString())

Desenvolvimento/teste sem o runtime do Tauri

import { createXidTauriClient, createMemoryKeychainAdapter } from '@xid-kit/tauri'

const client = createXidTauriClient({
  issuer: 'http://localhost:8788',
  clientId: 'test-client',
  redirectUri: 'http://localhost:1420/callback',
  keychain: createMemoryKeychainAdapter(),
})

Opções de createXidTauriClient

Opcao Tipo Descrição
issuer string URL do emissor XID
clientId string client_id OAuth 2.0
redirectUri string Callback de esquema de URI personalizado
scopes readonly string[] Padrão: openid, profile, email
keychain XidKeychainAdapter Adaptador de armazenamento de tokens; padrão é MemoryKeychainAdapter(use o adaptador Tauri em produção)

Métodos do XidTauriClient

Método Descrição
signIn(options?) Constrói a URL de autorização PKCE; abre via callback openUrl
handleRedirect(url) Processa o deeplink, valida o state, troca o código por tokens
getSession() TauriSession ou null para uma sessão local atual não expirada; o estado expirado é limpo
getAccessToken(options?) String do token de acesso atual não expirado ou null; nenhuma solicitação de renovação é realizada. O SDK rejeita offline_access até que DPoP seja implementado.
signOut() Limpar o estado local do Keychain sem uma solicitação de revogação
buildSignOutUrl(options?) Constrói a URL end_session OIDC para logout iniciado pelo RP
setTokenStorage(adapter) Substitui o adaptador de keychain em tempo de execução

PKCE e armazenamento de tokens

  • PKCE S256 é sempre usado. O desafio plain nunca é gerado.
  • A entropia do verificador é 64 bytes; o desafio é derivado via WebCrypto crypto.subtle.digest('SHA-256', ...).
  • Todas as chaves usam o namespace xid.*. xid.access_token é a atual. xid.refresh_token é removida apenas para limpar dados legados. xid.session, xid.pkce_verifier e xid.oauth_state contêm o estado atual da sessão e da autorização; nenhuma credencial de renovação é lida ou gravada.
Navegação

Digite para pesquisar...

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