4NK Dev 74624711a0 refactor: Nettoyage et simplification du projet
-  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/)
2025-09-29 21:34:29 +00:00

286 lines
8.9 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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
};