Statut
Statut du registre : UNPUBLISHED. Installez ce SDK uniquement depuis un checkout du code source du dépôt ; n’utilisez pas de registre de paquets externe.
Le statut du package est Package actuel. Le pont JS, le flux PKCES256, le gestionnaire de callback deeplink, l’adaptateur de trousseau OSet le modèle de plugin Rust sont implémentés. Un aller-retour réel avec unIdP sur une infrastructure de production est en attente de vérificationmanuelle.
Configuration Tauri
// tauri.conf.json
{
"bundle": { "identifier": "com.example.myapp" },
"plugins": {
"deep-link": { "desktop": { "schemes": ["myapp"] } }
}
}Plugin Rust
Copiez templates/xid-keychain-plugin.rs dans src-tauri/src/xid_keychain.rs et enregistrez-le en suivant templates/tauri-app-setup.rs. Ajoutez keyring = "2", tauri-plugin-deep-link = "2" et tauri-plugin-shell = "2" dans src-tauri/Cargo.toml.
Intégration 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 })Récupération du jeton et déconnexion
// 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())Développement/test sans runtime 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(),
})Options de createXidTauriClient
| Option | Type | Description |
|---|---|---|
issuer |
chaîne | URL d’émetteur XID |
clientId |
chaîne | client_id OAuth 2.0 |
redirectUri |
chaîne | Callback de schéma URI personnalisé |
scopes |
readonly string[] | Par défaut : openid, profile, email |
keychain |
XidKeychainAdapter | Adaptateur de stockage des jetons ; par défaut MemoryKeychainAdapter(utiliser l’adaptateur Tauri en production) |
Méthodes XidTauriClient
| Méthode | Description |
|---|---|
signIn(options?) |
Construire l’URL d’autorisation PKCE ; ouvrir via le callback openUrl |
handleRedirect(url) |
Analyser le deeplink, valider l’état, échanger le code contre des jetons |
getSession() |
TauriSession ou null pour une session locale actuelle non expirée; l’état expiré est effacé |
getAccessToken(options?) |
Chaîne du jeton d’accès actuel non expiré ou null; aucune requête de renouvellement n’est effectuée. Le SDK rejette offline_access tant que DPoP n’est pas implémenté. |
signOut() |
Effacer l’état local du trousseau sans requête de révocation |
buildSignOutUrl(options?) |
Construire l’URL end_session OIDC pour la déconnexion initiée par le RP |
setTokenStorage(adapter) |
Remplacer l’adaptateur de trousseau à l’exécution |
PKCE et stockage des jetons
- PKCE S256 est toujours utilisé. Le challenge plain n’est jamais généré.
- L’entropie du vérificateur est de 64 octets ; le challenge est dérivé viaWeb Crypto
crypto.subtle.digest('SHA-256', ...). - Toutes les clés utilisent l’espace de noms
xid.*.xid.access_tokenest actuelle.xid.refresh_tokenest supprimée uniquement pour nettoyer les données héritées.xid.session,xid.pkce_verifieretxid.oauth_statecontiennent l’état actuel de la session et de l’autorisation; aucun identifiant de renouvellement n’est lu ni écrit.