---
title: "@vonvon-kit/tauri"
description: "SDK de escritorio Tauri v2 con flujo PKCE S256, manejador de callback de deep link, adaptador al llavero del SO y plantilla de plugin en Rust."
locale: "es"
---

> Documentation Index
> Fetch the relevant documentation index at: https://vonvon.id/es/sdks/llms.txt
> Use this file to discover all available pages before exploring further.

# @vonvon-kit/tauri

## Estado

Estado del registro: UNPUBLISHED. Instala este SDK únicamente desde el checkout del código fuente del repositorio; no uses un registro de paquetes externo.

El estado del paquete es **Paquete actual**. El bridge JS, el flujo PKCE S256, el manejador de callback de deep link, el adaptador al llavero del SO y la plantilla de plugin Rust están implementados. Una prueba de ida y vuelta real contra un IdP en infraestructura de producción está pendiente de verificación manual.

## Configuración de Tauri

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

## Plugin en Rust

Copia `templates/vonvon-keychain-plugin.rs` en `src-tauri/src/vonvon_keychain.rs` y regístralo siguiendo `templates/tauri-app-setup.rs`. Añade `keyring = \"2\"`, `tauri-plugin-deep-link = \"2\"` y `tauri-plugin-shell = \"2\"` a `src-tauri/Cargo.toml`.

## Integración JS

```ts
import { createVonvonTauriClient, createTauriKeychainAdapter } from '@vonvon-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 = createVonvonTauriClient({
  issuer: 'https://vonvon.id',
  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 })
```

## Obtención de tokens y cierre de sesión

```ts
// 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())
```

## Desarrollo/pruebas sin entorno de ejecución Tauri

```ts
import { createVonvonTauriClient, createMemoryKeychainAdapter } from '@vonvon-kit/tauri'

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

## Opciones de createVonvonTauriClient

| Opción | Tipo | Descripción |
| --- | --- | --- |
| `issuer` | string | URL del emisor Vonvon |
| `clientId` | string | client\_id de OAuth 2.0 |
| `redirectUri` | string | Callback de esquema URI personalizado |
| `scopes` | readonly string\[\] | Por defecto: openid, profile, email |
| `keychain` | VonvonKeychainAdapter | Adaptador de almacenamiento de tokens; por defecto es MemoryKeychainAdapter (usa el adaptador Tauri en producción) |

## Métodos de VonvonTauriClient

| Método | Descripción |
| --- | --- |
| `signIn(options?)` | Construye la URL de autorización PKCE; ábrel via callback openUrl |
| `handleRedirect(url)` | Analiza el deep link, valida el estado e intercambia el código por tokens |
| `getSession()` | TauriSession o null para una sesión local actual no caducada; se borra el estado caducado |
| `getAccessToken(options?)` | Cadena del token de acceso actual no caducado o null; no se realiza ninguna solicitud de actualización. El SDK rechaza offline\_access hasta que se implemente DPoP. |
| `signOut()` | Borra el estado local del Keychain sin enviar una solicitud de revocación |
| `buildSignOutUrl(options?)` | Construye la URL OIDC end\_session para cierre de sesión iniciado por el RP |
| `setTokenStorage(adapter)` | Intercambiar el adaptador del llavero en tiempo de ejecución |

## PKCE y almacenamiento de tokens

- Siempre se usa PKCE S256. Nunca se genera un challenge plain.
- La entropía del verificador es de 64 bytes; el challenge se deriva mediante Web Crypto `crypto.subtle.digest('SHA-256', ...)`.
- Todas las claves usan el espacio de nombres `vonvon.*`. `vonvon.access_token` está vigente. `vonvon.refresh_token` solo se elimina para limpiar datos heredados. `vonvon.session`, `vonvon.pkce_verifier` y `vonvon.oauth_state` contienen el estado actual de la sesión y la autorización; no se leen ni escriben credenciales de actualización.

Source: https://vonvon.id/es/sdks/tauri/index.mdx
