Estado
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
// tauri.conf.json
{
"bundle": { "identifier": "com.example.myapp" },
"plugins": {
"deep-link": { "desktop": { "schemes": ["myapp"] } }
}
}Plugin en Rust
Copia templates/xid-keychain-plugin.rs en src-tauri/src/xid_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
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 })Obtención de tokens y cierre de sesión
// Get current access token (refreshes transparently if near expiry)
const token = await client.getAccessToken()
// Get full session (userId, organizationId, expiresAt)
const session = await client.getSession()
// Revoke server session and clear all keychain entries
await client.signOut()
// OIDC RP-initiated logout URL for full IdP sign-out
const logoutUrl = client.buildSignOutUrl({ postLogoutRedirectUri: 'myapp://logout' })
await open(logoutUrl.toString())Desarrollo/pruebas sin entorno de ejecución 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(),
})Opciones de createXidTauriClient
| Opción | Tipo | Descripción |
|---|---|---|
issuer |
string | URL del emisor XID |
clientId |
string | client_id de OAuth 2.0 |
redirectUri |
string | Callback de esquema URI personalizado |
scopes |
readonly string[] | Por defecto: openid, profile, email |
keychain |
XidKeychainAdapter | Adaptador de almacenamiento de tokens; por defecto es MemoryKeychainAdapter (usa el adaptador Tauri en producción) |
Métodos de XidTauriClient
| 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; renueva el token si está próximo a expirar |
getAccessToken(options?) |
Cadena del access token o null; se renueva automáticamente si está próximo a expirar |
signOut() |
Revoca la sesión del servidor y limpia el llavero |
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
xid.*:xid.access_token,xid.refresh_token,xid.session,xid.pkce_verifier,xid.oauth_state.