sunuid-sdk 1.0.25 → 1.0.26
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 +204 -24
- package/dist/sunuid-sdk.esm.js +1133 -6250
- package/dist/sunuid-sdk.esm.js.map +1 -1
- package/dist/sunuid-sdk.js +1135 -6245
- package/dist/sunuid-sdk.js.map +1 -1
- package/dist/sunuid-sdk.min.js +9 -2
- package/dist/sunuid-sdk.min.js.map +1 -1
- package/package.json +1 -3
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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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:
|
|
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.
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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.
|
|
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.
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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 | `
|
|
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
|
|
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
|
-
#### `
|
|
242
|
-
Génère un QR code
|
|
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.
|
|
387
|
+
sunuid.generateSignatureQR('container-id', {
|
|
246
388
|
theme: 'dark',
|
|
247
|
-
|
|
248
|
-
|
|
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
|
|