Aller au contenu

sdk/linux

SDK Rust pour bureau Linux utilisant xdg-open pour lancer le navigateur,TCP loopback pour le callback d'autorisation, PKCE S256 et le stockage dejetons Secret Service de freedesktop.org.

Afficher en Markdown

Statut

L’état du package est Implémenté et vérifié localement. La suite de tests unitaires Rust réussit. Le stockage Secret Service via D-Bus, xdg-open, le callback loopback complet et un aller-retour réel avec un IdP nécessitent encore un environnement d’intégration Linux de bureau. Cette page documente le comportement implémenté; elle ne constitue pas une déclaration d’aptitude à la production.

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.

Prérequis

  • Rust (stable, édition 2021)
  • runtime async tokio
  • Linux bureau avec xdg-open (xdg-utils) pour lancer le navigateur systèmeet une session D-Bus active avec gnome-keyring ou kwallet pour le stockageSecret Service
  • Environnements headless / CI : utilisez la fonctionnalitéin-memory-storage ou injectez InMemoryStorage directement

Installation

Ajoutez xid-linux dans Cargo.toml :

[dependencies]
xid-linux = { path = "../xid/sdk/linux" }
tokio = { version = "1", features = ["full"] }

Démarrage rapide

use xid_linux::{XidClient, XidConfigBuilder};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // 1. Build config. offline_access is rejected until DPoP is implemented.
    let config = XidConfigBuilder::new()
        .issuer("https://xid.dev")
        .client_id("your_client_id")
        .redirect_uri("http://127.0.0.1:51234/callback")
        .redirect_port(51234)
        .build()?;

    // 2. Create client (default: Secret Service storage)
    let client = XidClient::configure(config)?;

    // 3. Sign in. xdg-open launches the browser and loopback TCP receives the callback.
    let session = client.sign_in(None).await?;
    println!("user: {}", session.user.sub);

    // 4. Get the current unexpired access token. Expiry returns SessionExpired.
    let token = client.get_access_token(None).await?;

    // 5. Clear local token and guest state. No revoke request is sent.
    client.sign_out().await?;
    Ok(())
}

Utilisation headless / CI

Quand aucun démon D-Bus Secret Service n’est disponible, passezInMemoryStorage pour éviter une erreur d’exécution :

use xid_linux::{XidClient, XidConfigBuilder};
use xid_linux::storage::InMemoryStorage;
use std::sync::Arc;

let config = XidConfigBuilder::new()
    .issuer("https://xid.dev")
    .client_id("your_client_id")
    .redirect_uri("http://127.0.0.1:51234/callback")
    .build()?;

let client = XidClient::configure_with_storage(config, Arc::new(InMemoryStorage::new()))?;

API principale

Méthode Description
XidConfigBuilder::new() Constructeur pour XidConfig. Champs requis : issuer, client_id,redirect_uri. Optionnels : scopes, redirect_port (par défaut 51234),http_timeout_secs (par défaut 30).
XidClient::configure(config) Créer le client avec le SecretServiceStorage par défaut.
XidClient::configure_with_storage(config, adapter) Créer le client avec un StorageAdapter personnalisé (p. ex.InMemoryStorage).
sign_in(options) async Ouvrir le navigateur via xdg-open, démarrer l’écouteur TCP loopback surredirect_port, attendre le callback de code d’autorisation, l’échanger,stocker les jetons et retourner une Session.
get_session() async Retourner la session stockée actuelle non expirée; l’expiration efface l’état local du jeton et retourne SessionExpired.
get_access_token(options) async Retourner le jeton d’accès actuel non expiré; l’expiration ou force_refresh efface l’état local du jeton et retourne SessionExpired.
sign_out() async Effacer le stockage local des jetons et de la session invitée; aucune requête de révocation n’est envoyée.
set_token_storage(adapter) Remplacer l’adaptateur de stockage après la construction.

Adaptateurs de stockage

Adaptateur Description
SecretServiceStorage Par défaut. Stocke les jetons dans le Secret Service freedesktop.org(gnome-keyring ou kwallet) via D-Bus. Nécessite une session bureau active.
InMemoryStorage Mémoire en cours de processus uniquement. Les jetons sont perdus à la findu processus. À utiliser pour les tests ou les environnements CI sansSecret Service.

Sécurité

  • Client public — aucun secret client stocké ni transmis.
  • PKCE S256 uniquement. Le serveur rejette la méthode plain challenge.
  • État OAuth validé sur le callback loopback pour prévenir le CSRF(redirection loopback RFC 8252).
  • Secret Service chiffre les jetons au repos via le démon de trousseau dubureau — l’application ne gère pas directement les clés de chiffrement.
  • Le SDK rejette offline_access tant que DPoP n’est pas implémenté; les champs de réponse refresh_token inattendus ne sont pas persistés.

Limites connues

  • La vérification des jetons d’identité adossée à JWKS, la validation du nonce et le renouvellement du cache JWKS sont implémentés et testés localement. Un Secret Service de bureau et un aller-retour réel avec un IdP restent requis avant le support L4.
  • Le port de redirection est fixe et doit correspondre au redirect_urienregistré dans la console XID. La randomisation dynamique du port (RFC8252) nécessite la prise en charge de l’enregistrement dynamique declient.
  • La redirection du navigateur systeme et le stockage Secret Service necessitent une preuve d environnement de bureau.
Navigation

Saisissez votre recherche...

Utilisez les touches fléchées pour naviguerAppuyez sur Entrée pour sélectionnerAppuyez sur Échap pour fermer