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
// 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 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
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 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
xid.*.xid.access_tokenestá vigente.xid.refresh_tokensolo se elimina para limpiar datos heredados.xid.session,xid.pkce_verifieryxid.oauth_statecontienen el estado actual de la sesión y la autorización; no se leen ni escriben credenciales de actualización.