sunuid-sdk 1.0.25 → 1.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,13 +10,16 @@ SDK JavaScript officiel pour intégrer facilement les QR codes d'authentificatio
10
10
 
11
11
  - 🔐 **Authentification QR Code** - Connexion sécurisée avec SunuID
12
12
  - 📋 **Vérification KYC** - Collecte et validation d'identité
13
+ - 🔒 **Mode Sécurisé** - Initialisation via PHP pour masquer les credentials
13
14
  - 🌐 **WebSocket en Temps Réel** - Connexion automatique pour les mises à jour
14
15
  - 🎨 **Thèmes personnalisables** - Support des thèmes clair et sombre
15
16
  - 🔄 **Actualisation automatique** - QR codes qui se renouvellent automatiquement
16
17
  - 📱 **Responsive design** - Compatible mobile et desktop
17
18
  - 🌍 **Multi-langue** - Support français, anglais, arabe
18
- - 🛡️ **Sécurisé** - Authentification par clés API
19
- - 🔢 **Types numériques** - Support des types 1, 2, 3 pour différents services
19
+ - 🛡️ **Sécurisé** - Authentification par clés API avec validation renforcée
20
+ - 🔢 **Types de services** - Support des types 1 (KYC), 2 (AUTH), 3 (SIGNATURE)
21
+ - 🎯 **Affichage progressif** - Loader et animations fluides
22
+ - 📊 **Logs de sécurité** - Monitoring et debugging avancés
20
23
 
21
24
  ## 🚀 Installation
22
25
 
@@ -33,22 +36,24 @@ npm install sunuid-sdk
33
36
  <script src="https://cdn.socket.io/4.7.0/socket.io.min.js"></script>
34
37
 
35
38
  <!-- CSS -->
36
- <link rel="stylesheet" href="https://unpkg.com/sunuid-sdk@1.0.23/dist/sunuid-sdk.css">
39
+ <link rel="stylesheet" href="https://unpkg.com/sunuid-sdk@1.0.25/dist/sunuid-sdk.css">
37
40
 
38
41
  <!-- JavaScript -->
39
- <script src="https://unpkg.com/sunuid-sdk@1.0.23/dist/sunuid-sdk.js"></script>
42
+ <script src="https://unpkg.com/sunuid-sdk@1.0.25/dist/sunuid-sdk.js"></script>
40
43
  ```
41
44
 
42
45
  ## 📖 Utilisation Rapide
43
46
 
44
- ### 1. Initialisation avec WebSocket
47
+ > **🚀 [Démarrage en 30 secondes](GET_STARTED.md)** | **🌍 [Intégration Universelle](INTEGRATION_UNIVERSAL.md)** | **⚡ [Démarrage en 2 minutes](QUICKSTART.md)** | **💡 [Intégration simplifiée](INTEGRATION_SIMPLE.md)** | **🔒 [Intégration PHP complète](PHP_INTEGRATION.md)**
48
+
49
+ ### 1. Mode Classique (Credentials visibles)
45
50
 
46
51
  ```javascript
47
52
  const sunuid = initSunuID({
48
53
  apiUrl: 'https://api.sunuid.fayma.sn',
49
54
  clientId: 'VOTRE_CLIENT_ID',
50
55
  secretId: 'VOTRE_SECRET_ID',
51
- type: 1, // 1 = authentification, 2 = KYC, 3 = service personnalisé
56
+ type: 2, // 1 = KYC, 2 = AUTH, 3 = SIGNATURE
52
57
  theme: 'light',
53
58
  onSuccess: function(data) {
54
59
  console.log('Authentification réussie:', data);
@@ -65,7 +70,26 @@ const sunuid = initSunuID({
65
70
  });
66
71
  ```
67
72
 
68
- ### 2. Génération QR avec WebSocket
73
+ ### 2. Mode Sécurisé (Credentials masqués)
74
+
75
+ ```javascript
76
+ const sunuid = initSunuID({
77
+ apiUrl: 'https://api.sunuid.fayma.sn',
78
+ type: 2, // 1 = KYC, 2 = AUTH, 3 = SIGNATURE
79
+ secureInit: true, // Active le mode sécurisé
80
+ secureInitUrl: 'https://votre-serveur.com/secure-init.php',
81
+ theme: 'light',
82
+ partnerName: 'Votre Entreprise',
83
+ onSuccess: function(data) {
84
+ console.log('Authentification réussie:', data);
85
+ },
86
+ onError: function(error) {
87
+ console.error('Erreur:', error);
88
+ }
89
+ });
90
+ ```
91
+
92
+ ### 3. Génération QR avec WebSocket
69
93
 
70
94
  ```html
71
95
  <div id="qr-container"></div>
@@ -83,7 +107,7 @@ console.log('QR généré:', result.qrCodeUrl);
83
107
  console.log('Service ID:', result.service_id);
84
108
  ```
85
109
 
86
- ### 3. Écoute des événements WebSocket
110
+ ### 4. Écoute des événements WebSocket
87
111
 
88
112
  ```javascript
89
113
  // Le SDK se connecte automatiquement au WebSocket
@@ -102,9 +126,99 @@ sunuid.emitWebSocketEvent('custom_event', {
102
126
  const status = sunuid.getWebSocketStatus(); // 'connected', 'disconnected', 'not_initialized'
103
127
  ```
104
128
 
129
+ ## 🔒 Mode Sécurisé
130
+
131
+ ### Configuration PHP
132
+
133
+ Créez un endpoint PHP pour l'initialisation sécurisée :
134
+
135
+ ```php
136
+ <?php
137
+ // secure-init.php
138
+ header('Access-Control-Allow-Origin: *');
139
+ header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
140
+ header('Access-Control-Allow-Headers: Content-Type');
141
+ header('Content-Type: application/json');
142
+
143
+ $SUNUID_CONFIG = [
144
+ 'client_id' => 'VOTRE_CLIENT_ID',
145
+ 'secret_id' => 'VOTRE_SECRET_ID',
146
+ 'api_url' => 'https://api.sunuid.fayma.sn',
147
+ 'token_expiry' => 3600,
148
+ 'max_requests_per_token' => 100
149
+ ];
150
+
151
+ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
152
+ $input = json_decode(file_get_contents('php://input'), true);
153
+
154
+ // Validation des paramètres
155
+ if (!isset($input['type']) || !in_array($input['type'], [1, 2, 3])) {
156
+ echo json_encode(['success' => false, 'error' => 'Type invalide']);
157
+ exit;
158
+ }
159
+
160
+ // Génération du token sécurisé
161
+ $payload = [
162
+ 'client_id' => $SUNUID_CONFIG['client_id'],
163
+ 'secret_id' => $SUNUID_CONFIG['secret_id'],
164
+ 'api_url' => $SUNUID_CONFIG['api_url'],
165
+ 'type' => $input['type'],
166
+ 'partner_name' => $input['partnerName'] ?? 'SunuID',
167
+ 'theme' => $input['theme'] ?? 'light',
168
+ 'exp' => time() + $SUNUID_CONFIG['token_expiry'],
169
+ 'iat' => time(),
170
+ 'jti' => uniqid('sunuid_', true)
171
+ ];
172
+
173
+ $token = base64_encode(json_encode($payload));
174
+
175
+ echo json_encode([
176
+ 'success' => true,
177
+ 'data' => [
178
+ 'token' => $token,
179
+ 'expires_in' => $SUNUID_CONFIG['token_expiry'],
180
+ 'api_url' => $SUNUID_CONFIG['api_url'],
181
+ 'type' => $input['type'],
182
+ 'partner_name' => $input['partnerName'] ?? 'SunuID',
183
+ 'theme' => $input['theme'] ?? 'light',
184
+ 'max_requests' => $SUNUID_CONFIG['max_requests_per_token']
185
+ ],
186
+ 'message' => 'Token généré avec succès'
187
+ ]);
188
+ }
189
+ ?>
190
+ ```
191
+
192
+ ### Avantages du Mode Sécurisé
193
+
194
+ - 🔐 **Credentials masqués** - Non visibles dans le code client
195
+ - ⏰ **Tokens temporaires** - Expiration automatique
196
+ - 📊 **Limite de requêtes** - Contrôle d'usage
197
+ - 🛡️ **Validation côté serveur** - Sécurité renforcée
198
+
105
199
  ## 🎨 Exemples
106
200
 
107
- ### Page de Connexion avec WebSocket
201
+ ### Exemples Universels
202
+
203
+ - **[Connexion Universelle](examples/universal-login.html)** - Copier-coller en 30 secondes
204
+ - **[KYC Universel](examples/universal-kyc.html)** - Vérification d'identité simple
205
+ - **[Guide d'intégration universelle](INTEGRATION_UNIVERSAL.md)** - Pour tous les niveaux
206
+
207
+ ### Exemples Simples
208
+
209
+ - **[Connexion Simple](examples/simple-login.html)** - Page de connexion basique
210
+ - **[KYC Simple](examples/simple-kyc.html)** - Page de vérification KYC basique
211
+ - **[Guide d'intégration rapide](INTEGRATION_SIMPLE.md)** - Intégration en 3 étapes
212
+
213
+ ### Intégration Côté Serveur
214
+
215
+ - **[Intégration PHP complète](PHP_INTEGRATION.md)** - Gestion entièrement côté serveur
216
+ - **Credentials sécurisés** - Jamais exposés côté client
217
+ - **Validation serveur** - Contrôle total des requêtes
218
+ - **Webhooks** - Notifications en temps réel
219
+ - **Gestion des sessions** - Intégration avec votre système
220
+
221
+ ### Page de Connexion avec Mode Sécurisé
108
222
 
109
223
  ```html
110
224
  <!DOCTYPE html>
@@ -113,7 +227,7 @@ const status = sunuid.getWebSocketStatus(); // 'connected', 'disconnected', 'not
113
227
  <meta charset="UTF-8">
114
228
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
115
229
  <title>Connexion - Mon Application</title>
116
- <link rel="stylesheet" href="https://unpkg.com/sunuid-sdk@1.0.23/dist/sunuid-sdk.css">
230
+ <link rel="stylesheet" href="https://unpkg.com/sunuid-sdk@1.0.25/dist/sunuid-sdk.css">
117
231
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
118
232
  </head>
119
233
  <body>
@@ -133,15 +247,16 @@ const status = sunuid.getWebSocketStatus(); // 'connected', 'disconnected', 'not
133
247
  <script src="https://cdn.socket.io/4.7.0/socket.io.min.js"></script>
134
248
 
135
249
  <!-- SDK SunuID -->
136
- <script src="https://unpkg.com/sunuid-sdk@1.0.23/dist/sunuid-sdk.js"></script>
250
+ <script src="https://unpkg.com/sunuid-sdk@1.0.25/dist/sunuid-sdk.js"></script>
137
251
 
138
252
  <script>
139
253
  const sunuid = initSunuID({
140
254
  apiUrl: 'https://api.sunuid.fayma.sn',
141
- clientId: 'VOTRE_CLIENT_ID',
142
- secretId: 'VOTRE_SECRET_ID',
143
- type: 1,
255
+ type: 2, // AUTH
256
+ secureInit: true, // Mode sécurisé
257
+ secureInitUrl: 'https://votre-serveur.com/secure-init.php',
144
258
  theme: 'light',
259
+ partnerName: 'Mon Application',
145
260
  onSuccess: function(data) {
146
261
  console.log('✅ Authentification réussie:', data);
147
262
  window.location.href = '/dashboard?token=' + data.token;
@@ -172,18 +287,33 @@ const status = sunuid.getWebSocketStatus(); // 'connected', 'disconnected', 'not
172
287
  | Option | Type | Défaut | Description |
173
288
  |--------|------|--------|-------------|
174
289
  | `apiUrl` | string | `'https://api.sunuid.fayma.sn'` | URL de l'API SunuID |
175
- | `clientId` | string | - | Clé client (requise) |
176
- | `secretId` | string | - | Clé secrète (requise) |
177
- | `type` | number | `1` | Type de service: `1` (auth), `2` (KYC), `3` (personnalisé) |
290
+ | `clientId` | string | - | Clé client (requise en mode classique) |
291
+ | `secretId` | string | - | Clé secrète (requise en mode classique) |
292
+ | `type` | number | `2` | Type de service: `1` (KYC), `2` (AUTH), `3` (SIGNATURE) |
178
293
  | `theme` | string | `'light'` | Thème: `'light'` ou `'dark'` |
179
294
  | `language` | string | `'fr'` | Langue: `'fr'`, `'en'`, `'ar'` |
180
295
  | `autoRefresh` | boolean | `true` | Actualisation automatique |
181
296
  | `refreshInterval` | number | `30000` | Intervalle en millisecondes |
297
+ | `secureInit` | boolean | `false` | Active le mode sécurisé |
298
+ | `secureInitUrl` | string | `'http://localhost:8081/secure-init.php'` | URL de l'endpoint sécurisé |
299
+ | `partnerName` | string | `'SunuID'` | Nom du partenaire |
300
+ | `enableSecurityLogs` | boolean | `true` | Active les logs de sécurité |
301
+ | `validateInputs` | boolean | `true` | Validation des entrées |
302
+ | `maxRetries` | number | `3` | Nombre max de tentatives API |
303
+ | `requestTimeout` | number | `10000` | Timeout des requêtes (ms) |
182
304
  | `onSuccess` | function | - | Callback en cas de succès |
183
305
  | `onError` | function | - | Callback en cas d'erreur |
184
306
  | `onStatusUpdate` | function | - | Callback pour mises à jour WebSocket |
185
307
  | `onExpired` | function | - | Callback quand le QR expire |
186
308
 
309
+ ### Types de Services
310
+
311
+ | Type | Nom | Description |
312
+ |------|-----|-------------|
313
+ | `1` | **KYC** | Vérification d'identité et conformité |
314
+ | `2` | **AUTH** | Authentification utilisateur |
315
+ | `3` | **SIGNATURE** | Signature électronique (non supporté par l'API) |
316
+
187
317
  ### Événements WebSocket
188
318
 
189
319
  ```javascript
@@ -227,8 +357,20 @@ console.log('QR généré:', result.qrCodeUrl);
227
357
  console.log('Service ID:', result.service_id);
228
358
  ```
229
359
 
360
+ #### `generateKYCQR(containerId, options)` (Alias)
361
+ Génère un QR code KYC (type 1).
362
+
363
+ ```javascript
364
+ sunuid.generateKYCQR('container-id', {
365
+ theme: 'light',
366
+ kycType: 'full', // 'basic' ou 'full'
367
+ requiredFields: ['identity', 'address', 'phone'],
368
+ redirectUrl: 'https://votre-site.com/kyc-complete'
369
+ });
370
+ ```
371
+
230
372
  #### `generateAuthQR(containerId, options)` (Alias)
231
- Génère un QR code d'authentification (type 1).
373
+ Génère un QR code d'authentification (type 2).
232
374
 
233
375
  ```javascript
234
376
  sunuid.generateAuthQR('container-id', {
@@ -238,15 +380,14 @@ sunuid.generateAuthQR('container-id', {
238
380
  });
239
381
  ```
240
382
 
241
- #### `generateKYCQR(containerId, options)` (Alias)
242
- Génère un QR code KYC (type 2).
383
+ #### `generateSignatureQR(containerId, options)` (Alias)
384
+ Génère un QR code de signature (type 3) - **Non supporté par l'API**.
243
385
 
244
386
  ```javascript
245
- sunuid.generateKYCQR('container-id', {
387
+ sunuid.generateSignatureQR('container-id', {
246
388
  theme: 'dark',
247
- kycType: 'full', // 'basic' ou 'full'
248
- requiredFields: ['identity', 'address', 'phone'],
249
- redirectUrl: 'https://votre-site.com/kyc-complete'
389
+ documentId: 'doc-123',
390
+ signatureType: 'electronic'
250
391
  });
251
392
  ```
252
393
 
@@ -293,6 +434,23 @@ Force l'initialisation WebSocket si Socket.IO devient disponible plus tard.
293
434
  sunuid.forceWebSocketInit();
294
435
  ```
295
436
 
437
+ ### Méthodes de Sécurité
438
+
439
+ #### `getSecurityLogs()`
440
+ Récupère les logs de sécurité.
441
+
442
+ ```javascript
443
+ const logs = sunuid.getSecurityLogs();
444
+ console.log('Logs de sécurité:', logs);
445
+ ```
446
+
447
+ #### `clearSecurityLogs()`
448
+ Efface les logs de sécurité.
449
+
450
+ ```javascript
451
+ sunuid.clearSecurityLogs();
452
+ ```
453
+
296
454
  #### `destroy()`
297
455
  Nettoie les ressources du SDK et ferme la connexion WebSocket.
298
456
 
@@ -327,12 +485,21 @@ Le SDK se connecte automatiquement au WebSocket lors de l'initialisation :
327
485
  Le SDK utilise les clés API pour s'authentifier :
328
486
  - `clientId` et `secretId` dans le corps des requêtes
329
487
  - Connexion WebSocket sécurisée avec token
488
+ - Mode sécurisé avec tokens temporaires
330
489
 
331
490
  ### Validation
332
491
  - Vérification des paramètres requis
333
492
  - Validation des URLs de redirection
334
493
  - Protection contre les attaques CSRF
335
494
  - Types numériques pour éviter les injections
495
+ - Sanitisation des entrées utilisateur
496
+ - Logs de sécurité avec obfuscation des credentials
497
+
498
+ ### Mode Sécurisé
499
+ - Tokens temporaires avec expiration
500
+ - Limite de requêtes par token
501
+ - Validation côté serveur
502
+ - Credentials masqués du code client
336
503
 
337
504
  ## 🌐 Compatibilité
338
505
 
@@ -352,12 +519,22 @@ console.log('📤 Événement WebSocket émis: qr_generated');
352
519
  console.error('❌ Erreur connexion WebSocket:', error);
353
520
  ```
354
521
 
522
+ ### Logs de Sécurité
523
+ ```javascript
524
+ // Logs automatiques avec obfuscation
525
+ 🔒 [SECURITY] SDK_INIT_START
526
+ 🔒 [SECURITY] SECURE_INIT_SUCCESS
527
+ 🔒 [SECURITY] API_REQUEST_START
528
+ 🔒 [SECURITY] API_REQUEST_SUCCESS
529
+ ```
530
+
355
531
  ### Métriques
356
532
  Les partenaires peuvent suivre :
357
533
  - Nombre de QR codes générés
358
534
  - Taux de succès d'authentification
359
535
  - Temps de réponse de l'API
360
536
  - Statut des connexions WebSocket
537
+ - Utilisation du mode sécurisé
361
538
 
362
539
  ## 🆘 Support
363
540
 
@@ -365,6 +542,8 @@ Les partenaires peuvent suivre :
365
542
  - [Guide d'intégration](https://docs.sunuid.sn)
366
543
  - [API Reference](https://api.sunuid.sn/docs)
367
544
  - [Exemples](https://github.com/sunuid/sdk-examples)
545
+ - [Guide de sécurité](SECURITY_GUIDE.md)
546
+ - [Guide d'initialisation sécurisée](SECURE_INIT_GUIDE.md)
368
547
 
369
548
  ### Support technique
370
549
  - Email : support@sunuid.sn
@@ -414,6 +593,7 @@ Ce projet est distribué sous licence MIT. Voir le fichier [LICENSE](LICENSE) po
414
593
  - [Inter](https://rsms.me/inter/) pour la typographie
415
594
  - [Rollup](https://rollupjs.org/) pour le bundling
416
595
  - [Socket.IO](https://socket.io/) pour les WebSockets
596
+ - [Endroid QR Code](https://github.com/endroid/qr-code) pour la génération QR
417
597
 
418
598
  ---
419
599