4NK_vault/sdk-client/examples/secure-usage.ts
4NK Dev b13c8745e3 feat: Implémentation système sécurisé avec clés par utilisateur et environnement
-  API sécurisée avec authentification par ID utilisateur
-  HTTPS obligatoire avec rejet des connexions HTTP
-  Clés individuelles par utilisateur ET par environnement
-  Rotation automatique des clés avec sauvegarde de l'ancienne
-  Stockage sécurisé dans storage/<env>/_keys/
-  Client SDK mis à jour sans stockage de clés côté client
-  Documentation complète avec avertissements de sécurité
-  Tests complets du système sécurisé
- 🔒 Protection des fichiers sensibles dans .gitignore
2025-09-29 21:27:09 +00:00

286 lines
9.0 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 sécurisé Vault
* Avec authentification par clés utilisateur et rotation automatique
*/
import { SecureVaultClient, createSecureVaultClient } from '../src/secure-client';
async function secureBasicExample() {
console.log('🔐 Exemple d\'utilisation du client sécurisé 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 secureAdvancedExample() {
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 secureErrorHandlingExample() {
console.log('\n🔐 Exemple de gestion d\'erreurs sécurisée');
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 secureBasicExample();
await secureAdvancedExample();
await secureErrorHandlingExample();
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 {
secureBasicExample,
secureAdvancedExample,
secureErrorHandlingExample
};