JavaScript CDN Documentation
Single file for easy integration - API identical to CLI
Français
🚀 Installation ultra-simple
Télécharger et utiliser
<!-- 1. Inclure le fichier -->
<script src="sharokey.js"></script>
<!-- 2. Utiliser immédiatement -->
<script>
// Configuration (une seule fois)
Sharokey.config({token: 'votre-token-api'});
// Créer un secret (exactement comme le CLI)
Sharokey.create("Mon secret", 24, 1).then(secret => {
console.log('Lien:', secret.share_url);
});
</script>Via CDN - Pas encore disponible
<!-- Pas encore disponible -->
<!-- <script src="https://cdn.sharokey.com/sharokey.min.js"></script> -->🎯 API - Identique au CLI
Configuration
// Équivalent de: sharokey config --token xxx
Sharokey.config({
token: 'votre-token-api', // REQUIS
apiUrl: 'https://...', // Optionnel
defaultHours: 24, // Optionnel
defaultViews: 1 // Optionnel
});Créer un secret
// Équivalent de: sharokey create "message" --hours 24 --views 1
const secret = await Sharokey.create("Mon secret", 24, 1);
console.log('URL de partage:', secret.share_url);
console.log('Expire le:', secret.expiration);
// Avec options supplémentaires
const secret = await Sharokey.create("Secret important", 2, 1, {
description: "Mot de passe serveur",
message: "À utiliser avant 2h",
password: "protection123",
otpEmail: "[email protected]" // OTP par email
});
// Avec OTP par SMS
const secret = await Sharokey.create("Code d'accès critique", 1, 1, {
description: "Accès serveur production",
otpPhone: "+33674747474" // OTP par SMS
});
// Avec options de sécurité avancées
const secret = await Sharokey.create("Données ultra-confidentielles", 1, 1, {
description: "Accès maximum sécurisé",
message: "Manipuler avec une extrême précaution",
password: "mot-de-passe-extra-sécurisé",
captcha: true, // Vérification CAPTCHA
ipWhitelist: "192.168.1.0/24,10.0.0.1", // IPs autorisées
geolocation: "FR,US,CA", // Pays autorisés
otpEmail: "[email protected]"
});
// Restrictions géographiques uniquement
const secret = await Sharokey.create("Données RGPD", 6, 3, {
description: "Accès Union Européenne uniquement",
geolocation: "FR,DE,BE,NL,IT,ES" // Codes pays ISO
});
// Restriction IP pour réseau interne
const secret = await Sharokey.create("Documentation interne", 24, 5, {
description: "Accès bureau uniquement",
ipWhitelist: "192.168.1.0/24,203.0.113.5" // CIDR et IPs spécifiques
});
// Avec pièces jointes (max 10 fichiers, 10MB total combinés)
const fileInput = document.getElementById('fileInput'); // <input type="file" multiple>
const files = Array.from(fileInput.files);
const secret = await Sharokey.create("Documents confidentiels", 24, 3, {
description: "Contrat et annexes",
attachments: files, // Array de File objects
password: "protection2024"
});Demandes de secrets (Secret Requests)
// Créer une demande de secret (demander à quelqu'un de partager un secret avec vous)
const request = await Sharokey.createRequest({
message: "Merci de partager les identifiants de base de données",
description: "Accès DB production nécessaire",
secretExpirationHours: 24, // Le secret expirera dans 24h
requestExpirationHours: 48, // La demande expire dans 48h
maximumViews: 1, // Le secret peut être vu une seule fois
emailTo: "[email protected]",
emailReply: "[email protected]"
});
console.log('Demande créée:', request.url);
console.log('Envoyer cette URL au destinataire:', request.url);
// Lister vos demandes de secrets
const requests = await Sharokey.listRequests({status: 'active', limit: 10});
console.log('Demandes actives:', requests.data.length);
requests.data.forEach(req => {
console.log(`Demande ${req.token}: ${req.description}`);
console.log(` Statut: ${req.status}`);
console.log(` Expire: ${req.request_expiration}`);
});
// Obtenir les détails d'une demande spécifique
const request = await Sharokey.getRequest(123);
console.log('Demande:', request.message);
// Supprimer une demande
const success = await Sharokey.deleteRequest(123);
if (success) {
console.log('Demande supprimée avec succès');
}
// Obtenir les statistiques des demandes
const stats = await Sharokey.requestStats();
console.log('Total demandes:', stats.total_requests || 0);Lister les secrets
// Équivalent de: sharokey list
const result = await Sharokey.list();
console.log(`${result.data.length} secrets trouvés`);
// Avec filtres (équivalent de: sharokey list --limit 10 --status active)
const secrets = await Sharokey.list({
limit: 10,
status: 'active',
creator: '[email protected]'
});Détails d'un secret
// Équivalent de: sharokey get ABC123
const secret = await Sharokey.get('ABC123');
console.log('Description:', secret.data.description);
console.log('Vues restantes:', secret.data.maximum_views - secret.data.current_views);Supprimer un secret
// Équivalent de: sharokey delete ABC123
await Sharokey.delete('ABC123');
console.log('Secret supprimé');Statistiques
// Équivalent de: sharokey stats
const stats = await Sharokey.stats();
console.log('Total secrets:', stats.data.total_secrets);
console.log('Secrets actifs:', stats.data.active_secrets);💡 Exemples pratiques
Site web simple
<!DOCTYPE html>
<html>
<head>
<title>Partage de Secrets</title>
</head>
<body>
<h1>Créer un Secret</h1>
<textarea id="secret" placeholder="Votre secret..."></textarea><br>
<input type="number" id="hours" value="24" min="1" max="1000"> heures<br>
<input type="number" id="views" value="1" min="1" max="10"> vues max<br>
<input type="file" id="attachments" multiple> <small>Pièces jointes (max 10 fichiers, 10MB total)</small><br>
<button onclick="createSecret()">Créer</button>
<div id="result"></div>
<script src="sharokey.js"></script>
<script>
// Configuration
Sharokey.config({token: 'votre-token'});
async function createSecret() {
const content = document.getElementById('secret').value;
const hours = document.getElementById('hours').value;
const views = document.getElementById('views').value;
const attachments = Array.from(document.getElementById('attachments').files);
try {
const options = {};
if (attachments.length > 0) {
options.attachments = attachments;
}
const secret = await Sharokey.create(content, hours, views, options);
const attachmentInfo = attachments.length > 0
? `<p><strong>Pièces jointes :</strong> ${attachments.length} fichier(s)</p>`
: '';
document.getElementById('result').innerHTML = `
<h3>✅ Secret créé !</h3>
<p><strong>Lien :</strong> <a href="${secret.share_url}" target="_blank">${secret.share_url}</a></p>
<p><strong>Expire le :</strong> ${new Date(secret.expiration).toLocaleString()}</p>
${attachmentInfo}
<button onclick="navigator.clipboard.writeText('${secret.share_url}')">📋 Copier</button>
`;
} catch (error) {
document.getElementById('result').innerHTML = `
<h3>❌ Erreur</h3>
<p>${error.message}</p>
`;
}
}
</script>
</body>
</html>Générateur de mots de passe
<script src="sharokey.js"></script>
<script>
Sharokey.config({token: 'votre-token'});
async function generateAndShare() {
try {
// Générer un mot de passe et créer un secret
const result = await Sharokey.createPassword(
"Mot de passe généré automatiquement", // description
1, // 1 heure
1, // 1 vue
16 // 16 caractères
);
console.log('Mot de passe:', result.password);
console.log('Lien de partage:', result.secret.share_url);
alert(`
Mot de passe généré: ${result.password}
Lien: ${result.secret.share_url}
Le lien a été copié dans le presse-papiers.
`);
// Copier dans le presse-papiers
navigator.clipboard.writeText(result.secret.share_url);
} catch (error) {
alert('Erreur: ' + error.message);
}
}
// Appeler la fonction
generateAndShare();
</script>Dashboard simple
<script src="sharokey.js"></script>
<script>
Sharokey.config({token: 'votre-token'});
async function loadDashboard() {
try {
// Charger stats et secrets en parallèle
const [stats, secrets] = await Promise.all([
Sharokey.stats(),
Sharokey.list({limit: 10})
]);
// Afficher les stats
document.getElementById('stats').innerHTML = `
<h2>📊 Statistiques</h2>
<p>Total: ${stats.data.total_secrets}</p>
<p>Actifs: ${stats.data.active_secrets}</p>
<p>Vues totales: ${stats.data.total_views}</p>
`;
// Afficher les secrets récents
const secretsList = secrets.data.map(secret => `
<li>
<strong>${secret.description || secret.slug}</strong>
- ${secret.current_views}/${secret.maximum_views} vues
- Expire: ${new Date(secret.expiration).toLocaleDateString()}
<button onclick="deleteSecret('${secret.slug}')">🗑️</button>
</li>
`).join('');
document.getElementById('secrets').innerHTML = `
<h2>🔐 Secrets récents</h2>
<ul>${secretsList}</ul>
`;
} catch (error) {
console.error('Erreur dashboard:', error);
}
}
async function deleteSecret(slug) {
if (confirm('Supprimer ce secret ?')) {
try {
await Sharokey.delete(slug);
loadDashboard(); // Recharger
} catch (error) {
alert('Erreur: ' + error.message);
}
}
}
// Charger au démarrage
loadDashboard();
</script>
<div id="stats"></div>
<div id="secrets"></div>🔧 Fonctions utilitaires
Générer un mot de passe
// Mot de passe simple (16 caractères avec symboles)
const password = Sharokey.generatePassword();
// Mot de passe personnalisé
const password = Sharokey.generatePassword(24, false); // 24 chars, sans symbolesTester la connectivité
const isOnline = await Sharokey.testConnection();
if (!isOnline) {
alert('Impossible de se connecter à Sharokey');
}Voir la configuration
const config = Sharokey.getConfig();
console.log('API URL:', config.apiUrl);
console.log('Token configuré:', config.hasToken);🚨 Gestion d'erreurs
Erreurs communes
try {
await Sharokey.create("test");
} catch (error) {
switch (true) {
case error.message.includes('Token not configured'):
console.error('❌ Configurez votre token d\'abord !');
break;
case error.message.includes('Content is required'):
console.error('❌ Le contenu est requis');
break;
case error.message.includes('HTTP 401'):
console.error('❌ Token invalide');
break;
case error.message.includes('HTTP 429'):
console.error('❌ Trop de requêtes, attendez un peu');
break;
default:
console.error('❌ Erreur:', error.message);
}
}Validation locale
// La librairie valide automatiquement :
// - Contenu non vide
// - Heures entre 1 et 1000
// - Vues entre 1 et 1000
// - Token configuré
// - Attachments : max 10 fichiers, 10MB total
// - OTP : email et phone mutuellement exclusifs
try {
await Sharokey.create("", -1, 0); // Erreurs multiples
} catch (error) {
console.log(error.message); // "Content is required and must be a non-empty string"
}
try {
const files = [/* 15 fichiers */];
await Sharokey.create("test", 24, 1, {attachments: files});
} catch (error) {
console.log(error.message); // "Too many attachments. Maximum 10 files allowed, got 15"
}🔐 Sécurité
Chiffrement Zero Knowledge
- Algorithmes : AES-GCM-256 + PBKDF2 (10k iterations)
- Chiffrement côté client : Vos secrets ne quittent jamais le navigateur en clair
- Double clé : keyA (serveur) + keyB (URL fragment)
- Compatibilité : Identique au CLI et site web Sharokey
Bonnes pratiques
// ✅ Bon
const secret = await Sharokey.create("mot-de-passe-secret", 1, 1, {
password: "protection-additionnelle"
});
// ❌ À éviter
const secret = await Sharokey.create("mot-de-passe-secret", 1000, 10); // Trop long, trop de vues📱 Compatibilité
Navigateurs supportés
- ✅ Chrome 60+
- ✅ Firefox 55+
- ✅ Safari 11+
- ✅ Edge 79+
- ❌ Internet Explorer (Web Crypto API manquant)
Fonctionnalités requises
- Web Crypto API (pour le chiffrement)
- Fetch API (pour les requêtes)
- Promises/async-await
Test de compatibilité
try {
const password = Sharokey.generatePassword();
console.log('✅ Navigateur compatible');
} catch (error) {
console.log('❌ Navigateur non supporté:', error.message);
}🆚 Comparaison avec le CLI
| Fonctionnalité | CLI | JavaScript |
|---|---|---|
| Configuration | sharokey config --token xxx | Sharokey.config({token: 'xxx'}) |
| Création | sharokey create "secret" --hours 24 --views 1 | Sharokey.create("secret", 24, 1) |
| Liste | sharokey list --limit 10 | Sharokey.list({limit: 10}) |
| Détails | sharokey get ABC123 | Sharokey.get('ABC123') |
| Suppression | sharokey delete ABC123 | Sharokey.delete('ABC123') |
| Stats | sharokey stats | Sharokey.stats() |
| Chiffrement | ✅ Zero Knowledge | ✅ Identique |
| Format sortie | JSON | JSON (objets JavaScript) |
🔄 Migration depuis la version complète
Depuis sharokey-js (NPM)
// Avant (version NPM)
import { SharokeyClient } from 'sharokey-js';
const client = new SharokeyClient({token: 'xxx'});
await client.createSecret({content: "test", expirationHours: 24});
// Après (version simple)
<script src="sharokey.js"></script>
Sharokey.config({token: 'xxx'});
await Sharokey.create("test", 24, 1);Avantages version simple
- ✅ Aucune dépendance NPM
- ✅ Fichier unique (150KB)
- ✅ API plus simple (comme CLI)
- ✅ Intégration immédiate
Quand utiliser la version complète
- ❌ Applications Node.js complexes
- ❌ TypeScript strict requis
- ❌ Fonctionnalités avancées (batch, retry personnalisé)
❓ FAQ
Q: Puis-je utiliser cette version avec Node.js ? R: Oui, mais la version NPM complète est recommandée pour Node.js.
Q: Le token est-il visible dans le code ? R: Oui, comme toute variable JavaScript côté client. Ne l'utilisez que sur des domaines de confiance.
Q: Puis-je héberger le fichier sur mon serveur ? R: Oui, téléchargez sharokey.js et hébergez-le où vous voulez.
Q: Compatible avec les frameworks (React, Vue, Angular) ? R: Oui, mais vous devrez gérer le global Sharokey. La version NPM est plus adaptée.
Q: Puis-je modifier le code ? R: Oui, le code est open source. Attention à ne pas casser le chiffrement !
🚀 Prêt !
Votre fichier unique Sharokey est prêt à l'emploi !
- ✅ Téléchargez
sharokey.js - ✅ Incluez dans votre page HTML
- ✅ Configurez avec
Sharokey.config({token: 'xxx'}) - ✅ Utilisez exactement comme le CLI !
Version simple 1.0.0 - Compatible avec Sharokey API
English Documentation
🚀 Super Simple Installation
<!-- 1. Include the file -->
<script src="sharokey.js"></script>
<!-- 2. Use immediately -->
<script>
// One-time configuration
Sharokey.config({token: 'your-api-token'});
// Create a secret (exactly like CLI)
Sharokey.create("My secret", 24, 1).then(secret => {
console.log('Link:', secret.share_url);
});
</script>🎯 API - Identical to CLI
Basic Secret Creation
// Equivalent to: sharokey create "message" --hours 24 --views 1
const secret = await Sharokey.create("My secret", 24, 1);
console.log('Share URL:', secret.share_url);
console.log('Expires on:', secret.expiration);
// With additional options
const secret = await Sharokey.create("Important secret", 2, 1, {
description: "Server password",
message: "Use within 2 hours",
password: "protection123",
otpEmail: "[email protected]" // Email OTP
});🛡️ Advanced Security Options
// Maximum security combination
const secret = await Sharokey.create("Top secret data", 1, 1, {
description: "Maximum security access",
message: "Handle with extreme care",
password: "extra-secure-password",
captcha: true, // CAPTCHA verification
ipWhitelist: "192.168.1.0/24,10.0.0.1", // Allowed IPs
geolocation: "FR,US,CA", // Allowed countries
otpEmail: "[email protected]"
});
// Geographic restrictions only
const secret = await Sharokey.create("GDPR data", 6, 3, {
description: "European Union access only",
geolocation: "FR,DE,BE,NL,IT,ES" // ISO country codes
});
// IP restriction for internal network
const secret = await Sharokey.create("Internal docs", 24, 5, {
description: "Office network only",
ipWhitelist: "192.168.1.0/24,203.0.113.5" // CIDR and specific IPs
});
// CAPTCHA protection
const secret = await Sharokey.create("Sensitive information", 2, 1, {
description: "CAPTCHA protected",
captcha: true
});File Attachments with Security
// Files with security restrictions
const fileInput = document.getElementById('fileInput');
const files = Array.from(fileInput.files);
const secret = await Sharokey.create("Confidential documents", 24, 3, {
description: "Contract and annexes",
message: "Review and return by Friday",
attachments: files, // Max 10 files, 10MB total
password: "protection2024",
ipWhitelist: "192.168.1.0/24" // Office network only
});List and Manage Secrets
// List secrets
const result = await Sharokey.list();
console.log(`${result.data.length} secrets found`);
// With filters
const secrets = await Sharokey.list({
limit: 10,
status: 'active',
creator: '[email protected]'
});
// Get secret details
const secret = await Sharokey.get('ABC123');
console.log('Description:', secret.data.description);
console.log('Message:', secret.data.message);
console.log('Has CAPTCHA:', secret.data.captcha);
console.log('IP Whitelist:', secret.data.ip_whitelist);
console.log('Geolocation:', secret.data.geolocation);
// Delete secret
await Sharokey.delete('ABC123');Statistics and Utilities
// Get statistics
const stats = await Sharokey.stats();
console.log('Total secrets:', stats.data.total_secrets);
console.log('Active secrets:', stats.data.active_secrets);
// Generate password
const password = Sharokey.generatePassword(20);
console.log('Generated password:', password);
// Create secret with generated password
const result = await Sharokey.createPassword(
"Auto-generated password",
1, // 1 hour
1, // 1 view
16 // 16 characters
);🎛️ Configuration Options
Sharokey.config({
token: 'your-api-token', // REQUIRED
apiUrl: 'https://...', // Optional
timeout: 30000, // Optional (30 seconds)
defaultHours: 24, // Optional
defaultViews: 1 // Optional
});🔒 Security Features Summary
| Feature | Parameter | Description | Example |
|---|---|---|---|
| CAPTCHA | captcha: true | Requires CAPTCHA verification | captcha: true |
| IP Whitelist | ipWhitelist | Comma-separated IPs/CIDR (max 255 chars) | "192.168.1.0/24,10.0.0.1" |
| Geolocation | geolocation | Comma-separated country codes (max 255 chars) | "FR,US,CA,DE" |
| Password | password | Additional password protection | "secure-password" |
| OTP Email | otpEmail | Email for OTP verification | "[email protected]" |
| OTP SMS | otpPhone | Phone for SMS OTP | "+33674747474" |
| Message | message | Custom message for recipient | "Handle with care" |
🚨 Error Handling
try {
const secret = await Sharokey.create("My secret", 24, 1, {
captcha: true,
ipWhitelist: "invalid-format" // This will cause an error
});
} catch (error) {
console.error('Error creating secret:', error.message);
if (error.message.includes('token')) {
console.log('Check your API token configuration');
} else if (error.message.includes('validation')) {
console.log('Check your parameters');
}
}✅ Ready to Use!
Your single-file Sharokey is ready!
- ✅ Download
sharokey.js - ✅ Include in your HTML page
- ✅ Configure with
Sharokey.config({token: 'xxx'}) - ✅ Use exactly like the CLI with advanced security options!
Simple version 1.0.0 - Compatible with Sharokey API
