
- ✅ Suppression des fichiers redondants (api_server.py, start_api.sh, test_api.py) - ✅ Renommage des fichiers sécurisés vers les noms standards - ✅ Consolidation des exemples SDK en un seul fichier usage.ts - ✅ Suppression du client SDK déprécié - ✅ Mise à jour de la documentation principale - ✅ Simplification de la structure du projet - 🔒 Conservation de la sécurité (authentification par clés utilisateur) - 📁 Respect du stockage en lecture seule (storage/)
286 lines
8.9 KiB
TypeScript
286 lines
8.9 KiB
TypeScript
/**
|
||
* Exemple d'utilisation du client Vault
|
||
* Avec authentification par clés utilisateur et rotation automatique
|
||
*/
|
||
|
||
import { SecureVaultClient, createSecureVaultClient } from '../src/index';
|
||
|
||
async function basicExample() {
|
||
console.log('🔐 Exemple d\'utilisation du client Vault');
|
||
console.log('=' * 60);
|
||
|
||
try {
|
||
// 1. Création du client avec ID utilisateur
|
||
const client = createSecureVaultClient(
|
||
'https://vault.4nkweb.com:6666',
|
||
'demo_user_001' // ID utilisateur obligatoire
|
||
);
|
||
|
||
// 2. Vérification de la connectivité
|
||
console.log('🔍 Test de connectivité...');
|
||
const isConnected = await client.ping();
|
||
if (!isConnected) {
|
||
throw new Error('❌ Impossible de se connecter à l\'API');
|
||
}
|
||
console.log('✅ Connecté avec succès');
|
||
|
||
// 3. Récupération des informations API
|
||
console.log('\n📋 Informations sur l\'API...');
|
||
const info = await client.info();
|
||
console.log(` Nom: ${info.name}`);
|
||
console.log(` Version: ${info.version}`);
|
||
console.log(` Authentification: ${info.authentication}`);
|
||
console.log(` Rotation des clés: ${info.key_rotation}`);
|
||
|
||
// 4. Test de santé
|
||
console.log('\n🏥 Test de santé...');
|
||
const health = await client.health();
|
||
console.log(` Statut: ${health.status}`);
|
||
console.log(` Service: ${health.service}`);
|
||
console.log(` Chiffrement: ${health.encryption}`);
|
||
|
||
// 5. Récupération d'un fichier
|
||
console.log('\n📁 Récupération d\'un fichier...');
|
||
const file = await client.getFile('dev', 'bitcoin/bitcoin.conf');
|
||
console.log(` Fichier: ${file.filename}`);
|
||
console.log(` Taille: ${file.size} caractères`);
|
||
console.log(` Chiffré: ${file.encrypted}`);
|
||
console.log(` Algorithme: ${file.algorithm}`);
|
||
console.log(` Utilisateur: ${file.user_id}`);
|
||
console.log(` Version de clé: ${file.key_version}`);
|
||
console.log(` Timestamp: ${file.timestamp}`);
|
||
|
||
console.log('\n📄 Aperçu du contenu:');
|
||
console.log(file.content.substring(0, 200) + '...');
|
||
|
||
console.log('\n✅ Exemple terminé avec succès!');
|
||
|
||
} catch (error) {
|
||
console.error('\n❌ Erreur fatale:', error);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
async function advancedExample() {
|
||
console.log('\n🔐 Exemple avancé avec gestion d\'erreurs');
|
||
console.log('=' * 60);
|
||
|
||
try {
|
||
// 1. Création du client avec configuration complète
|
||
const client = new SecureVaultClient({
|
||
baseUrl: 'https://vault.4nkweb.com:6666',
|
||
userId: 'advanced_user_001',
|
||
verifySsl: false, // Désactivé pour les certificats auto-signés
|
||
timeout: 10000, // Timeout de 10 secondes
|
||
});
|
||
|
||
// 2. Gestion d'erreurs avancée
|
||
console.log('\n🛡️ Test de gestion d\'erreurs...');
|
||
|
||
try {
|
||
// Test avec un fichier inexistant
|
||
await client.getFile('dev', 'fichier/inexistant.conf');
|
||
} catch (error: any) {
|
||
if (error.name === 'VaultApiError') {
|
||
console.log(` ✅ Erreur API gérée: ${error.message}`);
|
||
} else {
|
||
console.log(` ❌ Erreur inattendue: ${error.message}`);
|
||
}
|
||
}
|
||
|
||
// 3. Test d'authentification
|
||
console.log('\n🔑 Test d\'authentification...');
|
||
try {
|
||
const invalidClient = new SecureVaultClient({
|
||
baseUrl: 'https://vault.4nkweb.com:6666',
|
||
userId: 'invalid@user' // ID invalide
|
||
});
|
||
|
||
await invalidClient.health();
|
||
console.log(' ❌ Authentification invalide acceptée (ne devrait pas arriver)');
|
||
} catch (error: any) {
|
||
console.log(` ✅ Authentification invalide rejetée: ${error.message}`);
|
||
}
|
||
|
||
// 4. Récupération de plusieurs fichiers
|
||
console.log('\n📚 Récupération de plusieurs fichiers...');
|
||
const files = [
|
||
'bitcoin/bitcoin.conf',
|
||
'nginx/nginx.conf',
|
||
'grafana/grafana.ini'
|
||
];
|
||
|
||
const results = await Promise.allSettled(
|
||
files.map(filePath => client.getFile('dev', filePath))
|
||
);
|
||
|
||
results.forEach((result, index) => {
|
||
if (result.status === 'fulfilled') {
|
||
console.log(` ✅ ${files[index]}: ${result.value.size} caractères`);
|
||
} else {
|
||
console.log(` ❌ ${files[index]}: ${result.reason.message}`);
|
||
}
|
||
});
|
||
|
||
// 5. Test de rotation des clés
|
||
console.log('\n🔄 Test de rotation des clés...');
|
||
const file1 = await client.getFile('dev', 'bitcoin/bitcoin.conf');
|
||
|
||
// Attendre un peu pour potentiellement déclencher une rotation
|
||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||
|
||
const file2 = await client.getFile('dev', 'bitcoin/bitcoin.conf');
|
||
|
||
if (file1.key_version !== file2.key_version) {
|
||
console.log(` ✅ Rotation détectée: ${file1.key_version} → ${file2.key_version}`);
|
||
} else {
|
||
console.log(` ⚠️ Aucune rotation détectée (normal si < 1h)`);
|
||
}
|
||
|
||
console.log('\n✅ Exemple avancé terminé avec succès!');
|
||
|
||
} catch (error) {
|
||
console.error('\n❌ Erreur fatale:', error);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
async function errorHandlingExample() {
|
||
console.log('\n🔐 Exemple de gestion d\'erreurs');
|
||
console.log('=' * 60);
|
||
|
||
try {
|
||
const client = createSecureVaultClient(
|
||
'https://vault.4nkweb.com:6666',
|
||
'error_test_user'
|
||
);
|
||
|
||
// 1. Test d'erreurs d'authentification
|
||
console.log('\n🔑 Test d\'erreurs d\'authentification...');
|
||
|
||
const testCases = [
|
||
{
|
||
name: 'ID utilisateur vide',
|
||
userId: '',
|
||
shouldFail: true
|
||
},
|
||
{
|
||
name: 'ID utilisateur trop court',
|
||
userId: 'ab',
|
||
shouldFail: true
|
||
},
|
||
{
|
||
name: 'ID utilisateur trop long',
|
||
userId: 'a'.repeat(51),
|
||
shouldFail: true
|
||
},
|
||
{
|
||
name: 'ID utilisateur avec caractères invalides',
|
||
userId: 'user@invalid',
|
||
shouldFail: true
|
||
},
|
||
{
|
||
name: 'ID utilisateur valide',
|
||
userId: 'valid_user_123',
|
||
shouldFail: false
|
||
}
|
||
];
|
||
|
||
for (const testCase of testCases) {
|
||
try {
|
||
const testClient = new SecureVaultClient({
|
||
baseUrl: 'https://vault.4nkweb.com:6666',
|
||
userId: testCase.userId
|
||
});
|
||
|
||
await testClient.ping();
|
||
|
||
if (testCase.shouldFail) {
|
||
console.log(` ❌ ${testCase.name}: Devrait échouer mais a réussi`);
|
||
} else {
|
||
console.log(` ✅ ${testCase.name}: Réussi comme attendu`);
|
||
}
|
||
} catch (error: any) {
|
||
if (testCase.shouldFail) {
|
||
console.log(` ✅ ${testCase.name}: Échec comme attendu - ${error.message}`);
|
||
} else {
|
||
console.log(` ❌ ${testCase.name}: Échec inattendu - ${error.message}`);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 2. Test d'erreurs réseau
|
||
console.log('\n🌐 Test d\'erreurs réseau...');
|
||
|
||
try {
|
||
const badClient = new SecureVaultClient({
|
||
baseUrl: 'https://nonexistent-domain.com:6666',
|
||
userId: 'test_user',
|
||
timeout: 1000 // Timeout court pour test rapide
|
||
});
|
||
|
||
await badClient.ping();
|
||
console.log(' ❌ Connexion à un domaine inexistant a réussi (ne devrait pas arriver)');
|
||
} catch (error: any) {
|
||
console.log(` ✅ Erreur réseau gérée: ${error.message}`);
|
||
}
|
||
|
||
// 3. Test d'erreurs de déchiffrement
|
||
console.log('\n🔓 Test d\'erreurs de déchiffrement...');
|
||
|
||
try {
|
||
// Tentative d'accès à un fichier qui pourrait causer des problèmes de déchiffrement
|
||
await client.getFile('dev', 'bitcoin/bitcoin.conf');
|
||
console.log(' ✅ Déchiffrement réussi');
|
||
} catch (error: any) {
|
||
if (error.name === 'VaultDecryptionError') {
|
||
console.log(` ✅ Erreur de déchiffrement gérée: ${error.message}`);
|
||
} else {
|
||
console.log(` ❌ Erreur inattendue: ${error.message}`);
|
||
}
|
||
}
|
||
|
||
console.log('\n✅ Exemple de gestion d\'erreurs terminé avec succès!');
|
||
|
||
} catch (error) {
|
||
console.error('\n❌ Erreur fatale:', error);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
// Fonction principale
|
||
async function main() {
|
||
console.log('🚀 Démonstration du client sécurisé Vault');
|
||
console.log('Avec authentification par clés utilisateur et rotation automatique');
|
||
console.log('=' * 80);
|
||
|
||
try {
|
||
await basicExample();
|
||
await advancedExample();
|
||
await errorHandlingExample();
|
||
|
||
console.log('\n🎉 Toutes les démonstrations terminées avec succès!');
|
||
console.log('\n📝 Points clés du système sécurisé:');
|
||
console.log(' • Authentification obligatoire par ID utilisateur');
|
||
console.log(' • HTTPS obligatoire');
|
||
console.log(' • Clés gérées côté serveur avec rotation automatique');
|
||
console.log(' • Aucune clé stockée dans le client');
|
||
console.log(' • Chiffrement quantum-résistant (ChaCha20-Poly1305)');
|
||
|
||
} catch (error) {
|
||
console.error('\n💥 Erreur fatale dans la démonstration:', error);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
// Exécution si appelé directement
|
||
if (require.main === module) {
|
||
main().catch(console.error);
|
||
}
|
||
|
||
export {
|
||
basicExample,
|
||
advancedExample,
|
||
errorHandlingExample
|
||
};
|