Documentation Technique - TRusTY
Version : 0.8.2-SNAPSHOT Dernière mise à jour : 2025-12-01 Architecture : Domain-Driven Design (DDD) + Clean Architecture
TRusTY est un fournisseur OpenID Connect (OIDC) implémentant les standards de sécurité FAPI 2.0, développé en Rust et Python.
Table des Matières
- Vue d’Ensemble de l’Architecture
- Serveur - Rust (Port 8081)
- Client - Python Flask (Port 5001/5002)
- Stack Technologique
- Base de Données & Persistance
- Fonctionnalités de Sécurité
- Déploiement
Vue d’Ensemble de l’Architecture
Architecture Haut Niveau
| |
Principes de Conception
- Domain-Driven Design (DDD) : Séparation claire de la logique métier et de l’infrastructure
- Clean Architecture : Dépendances pointant vers l’intérieur (Domain ← Application ← Infrastructure ← Presentation)
- Principes SOLID : Responsabilité unique, Inversion de dépendances, etc.
- Test-Driven Development : Tests unitaires et d’intégration complets
Serveur - Rust (Port 8081)
Structure du Projet
| |
Couche Domaine
Entités (Racines d’agrégat) :
User- Comptes utilisateurs avec identifiantsClient- Clients OIDC (applications demandant l’authentification)Session- Sessions utilisateurAuthorizationCode- Codes de courte durée pour échange de tokensAuthorizationSession- Suivi des requêtes d’autorisation
Objets Valeur :
Claims- Claims JWTScope- Scopes d’autorisationUserId,ClientId,SessionId- IDs typés
Services Domaine :
PasswordService- Hachage/vérification mot de passe (bcrypt)DpopService- Logique de liaison de token DPoP
Couche Application
Services (orchestrent les cas d’usage) :
TokenService- Génération/validation de tokensUserService- Création de claims utilisateurAuthorizationCodeService- Cycle de vie du code d’autorisationSessionService- Gestion des sessions
Couche Infrastructure
Repositories (accès aux données) :
- Implémentations SQLite (crate
sqlx) - Implémentations en mémoire (pour tests)
- Pattern Factory pour sélection du backend (configurable)
Services (implémentations techniques) :
JwtService- Signature/vérification JWT (RS256)JwksService- Gestion des clés publiquesDpopValidator- Validation des preuves DPoP (RFC 9449)ParService- Stockage des requêtes PAR (en mémoire, TTL 90s)I18nService- Internationalisation (Fluent.rs)AuditService- Journalisation d’audit vers SQLite
Couche Présentation
Handlers (endpoints HTTP) :
- Endpoints API RESTful
- Gestion de formulaires (login, logout)
- Réponses d’erreur (JSON/HTML)
Client - Python Flask (Port 5001/5002)
Types de Clients Démo
Client OIDC Standard (app.py - Port 5001) :
- Authorization Code Flow
- PKCE (S256)
- Authentification client_secret_post
- Gestion d’état basée sur session
Client FAPI 2.0 (fapi_client.py - Port 5002) :
- PAR (Pushed Authorization Request)
- PKCE (S256 - obligatoire)
- Authentification private_key_jwt
- Liaison de token DPoP
- Clés DPoP éphémères par session
Structure du Client
| |
Dépendances Python
| |
Stack Technologique
Serveur (Rust)
| Composant | Technologie | Version | Objectif |
|---|---|---|---|
| Framework Web | Axum | 0.8 | Serveur HTTP async |
| Runtime | Tokio | 1.0 | Runtime async |
| Base de Données | SQLite | - | Base de données embarquée |
| ORM | sqlx | 0.8 | Toolkit SQL async |
| JWT | jsonwebtoken | 9.0 | Signature/vérif JWT |
| Crypto | rsa, rand | 0.9 | Clés RSA, aléatoire |
| Mots de passe | bcrypt | 0.15 | Hachage sécurisé |
| Sérialisation | serde, serde_json | 1.0 | Parsing JSON/YAML |
| Templates | handlebars | 4.0 | Rendu HTML |
| i18n | fluent-templates | 0.11 | Traductions |
| Logging | tracing | 0.1 | Logging structuré |
| Télémétrie | OpenTelemetry | 0.24 | Tracing distribué |
| Sessions | tower-sessions | 0.12 | Gestion sessions |
| Config | serde_yaml | 0.9 | Configuration YAML |
Client (Python)
| Composant | Technologie | Objectif |
|---|---|---|
| Framework Web | Flask | Serveur HTTP |
| Client HTTP | requests, Authlib | Client OIDC |
| JWT | PyJWT | Parsing de tokens |
| Crypto | cryptography | Clés RSA, DPoP |
| i18n | Flask-Babel | Traductions |
| Sessions | Flask-Session | Stockage session |
Base de Données & Persistance
Schéma SQLite
Tables :
users- Comptes utilisateur (id UUID, username, email, password_hash, created_at)clients- Clients OIDC (id, client_secret, redirect_uris, jwks, auth_method, etc.)sessions- Sessions utilisateur (id UUID, user_id FK, created_at, expires_at, is_active)authorization_codes- Codes d’autorisation (code, user_id FK, client_id FK, redirect_uri, scope, code_challenge, created_at, expires_at, used)par_requests- Requêtes PAR (request_uri, client_id, params JSON, created_at, expires_at)audit_log- Événements d’audit (event_type, user_id, client_id, ip_address, user_agent, details JSON, timestamp)revoked_tokens- Tokens révoqués (jti, token_type, revoked_at, expires_at)
Système de Migration
- Fichiers de migration SQL dans
server/migrations/ - Appliqués au démarrage du serveur (idempotents)
- Suivi de version dans table
_migrations(futur)
Sélection du Backend
Configurable via config.yaml :
| |
Le pattern Repository Factory permet l’ajout facile de PostgreSQL, MySQL, etc.
Fonctionnalités de Sécurité
Standards Implémentés
| Fonctionnalité | Spécification | Statut |
|---|---|---|
| OIDC Core 1.0 | OpenID Connect Core | ✅ Implémenté |
| PKCE (S256) | RFC 7636 | ✅ Obligatoire |
| PAR | RFC 9126 | ✅ Implémenté |
| private_key_jwt | RFC 7523 | ✅ Implémenté |
| DPoP | RFC 9449 | ✅ Implémenté |
| FAPI 2.0 | FAPI 2.0 Security Profile | ✅ Implémenté |
| RP-Initiated Logout | OIDC RP-Initiated Logout 1.0 | ✅ Implémenté |
| Révocation Token | RFC 7009 | ✅ Implémenté |
| Introspection Token | RFC 7662 | ✅ Implémenté |
Mécanismes de Sécurité
Authentification :
- Hachage bcrypt des mots de passe (coût 12)
- Authentification client asymétrique (JWT RS256)
- Authentification basée session pour l’UI
Sécurité des Tokens :
- Signature RS256 (clés 2048-bit)
- Tokens de courte durée (access: 1h, auth code: 90s)
- Liaison de token avec DPoP (validation jkt)
- Suivi des révocations de tokens
Sécurité des Requêtes :
- PKCE (S256 uniquement, plain rejeté)
- Paramètre state (protection CSRF)
- Nonce (protection replay)
- PAR (protection altération paramètres)
- Objets de requête JWT signés
Audit :
- Toutes les tentatives d’authentification journalisées
- Opérations sur tokens suivies
- Adresse IP + User-Agent capturés
Déploiement
Support Docker
Dockerfile (serveur Rust) :
| |
docker-compose.yml :
| |
Déploiement Railway
CI/CD avec GitHub Actions :
- Branche
main→ Environnement Production - Branche
dev→ Environnement Développement - PR → Tests uniquement (pas de déploiement)
Variables d’Environnement :
BUILD_VERSION- Tag git ou SNAPSHOT-{timestamp}RUST_LOG- Niveau de logDATABASE_PATH- Chemin fichier SQLiteISSUER_URL- URL de l’émetteur OIDC
Structure Fichiers (Conforme FHS)
| |
Configuration
Config Serveur (server/config.yaml)
| |
Config Client (client/.env)
| |
Développement
Prérequis
Serveur :
- Rust 1.83+
- SQLite3
- OpenSSL
Client :
- Python 3.11+
- pip
Installation
| |
Tests
| |
Endpoints API
Voir Documentation Flux OIDC pour la documentation détaillée des endpoints.
Référence Rapide :
GET /.well-known/openid-configuration- Discovery OIDCGET /.well-known/jwks.json- Clés publiques (JWKS)GET /auth- Endpoint d’autorisationPOST /token- Endpoint de tokenGET /userinfo- Endpoint UserInfoPOST /par- Pushed Authorization RequestPOST /revoke- Révocation de tokenPOST /introspect- Introspection de tokenGET /logout- Logout initié par RPGET /health- Vérification santé
Monitoring & Observabilité
Logging
- Logging structuré avec
tracing - Format JSON pour production
- Rotation de fichiers (logs quotidiens)
- Niveaux de log : TRACE, DEBUG, INFO, WARN, ERROR
Métriques (Endpoints Observabilité)
GET /observability/sessions- Nombre de sessions activesGET /observability/tokens- Statistiques de tokensGET /observability/clients- Informations clients
OpenTelemetry (Futur)
- Support tracing distribué
- Configuration exportateur OTLP
- Intégration Jaeger/Zipkin prête
Références
Version du Document : 2.0 Statut : Prêt pour production Dernière Révision : 2025-12-01