sunuid-sdk 1.0.23 → 1.0.25
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 +164 -43
- package/dist/sunuid-sdk.esm.js +6218 -246
- package/dist/sunuid-sdk.esm.js.map +1 -1
- package/dist/sunuid-sdk.js +6063 -98
- package/dist/sunuid-sdk.js.map +1 -1
- package/dist/sunuid-sdk.min.js +2 -9
- package/dist/sunuid-sdk.min.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -10,11 +10,13 @@ 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
|
+
- 🌐 **WebSocket en Temps Réel** - Connexion automatique pour les mises à jour
|
|
13
14
|
- 🎨 **Thèmes personnalisables** - Support des thèmes clair et sombre
|
|
14
15
|
- 🔄 **Actualisation automatique** - QR codes qui se renouvellent automatiquement
|
|
15
16
|
- 📱 **Responsive design** - Compatible mobile et desktop
|
|
16
17
|
- 🌍 **Multi-langue** - Support français, anglais, arabe
|
|
17
18
|
- 🛡️ **Sécurisé** - Authentification par clés API
|
|
19
|
+
- 🔢 **Types numériques** - Support des types 1, 2, 3 pour différents services
|
|
18
20
|
|
|
19
21
|
## 🚀 Installation
|
|
20
22
|
|
|
@@ -27,54 +29,82 @@ npm install sunuid-sdk
|
|
|
27
29
|
### Via CDN
|
|
28
30
|
|
|
29
31
|
```html
|
|
32
|
+
<!-- Socket.IO requis pour WebSocket -->
|
|
33
|
+
<script src="https://cdn.socket.io/4.7.0/socket.io.min.js"></script>
|
|
34
|
+
|
|
30
35
|
<!-- CSS -->
|
|
31
|
-
<link rel="stylesheet" href="https://unpkg.com/sunuid-sdk@1.0.
|
|
36
|
+
<link rel="stylesheet" href="https://unpkg.com/sunuid-sdk@1.0.23/dist/sunuid-sdk.css">
|
|
32
37
|
|
|
33
38
|
<!-- JavaScript -->
|
|
34
|
-
<script src="https://unpkg.com/sunuid-sdk@1.0.
|
|
39
|
+
<script src="https://unpkg.com/sunuid-sdk@1.0.23/dist/sunuid-sdk.js"></script>
|
|
35
40
|
```
|
|
36
41
|
|
|
37
42
|
## 📖 Utilisation Rapide
|
|
38
43
|
|
|
39
|
-
### 1. Initialisation
|
|
44
|
+
### 1. Initialisation avec WebSocket
|
|
40
45
|
|
|
41
46
|
```javascript
|
|
42
47
|
const sunuid = initSunuID({
|
|
43
|
-
apiUrl: 'https://sunuid.fayma.sn
|
|
48
|
+
apiUrl: 'https://api.sunuid.fayma.sn',
|
|
44
49
|
clientId: 'VOTRE_CLIENT_ID',
|
|
45
50
|
secretId: 'VOTRE_SECRET_ID',
|
|
46
|
-
|
|
51
|
+
type: 1, // 1 = authentification, 2 = KYC, 3 = service personnalisé
|
|
52
|
+
theme: 'light',
|
|
53
|
+
onSuccess: function(data) {
|
|
54
|
+
console.log('Authentification réussie:', data);
|
|
55
|
+
},
|
|
56
|
+
onError: function(error) {
|
|
57
|
+
console.error('Erreur:', error);
|
|
58
|
+
},
|
|
59
|
+
onStatusUpdate: function(data) {
|
|
60
|
+
console.log('Mise à jour statut:', data);
|
|
61
|
+
},
|
|
62
|
+
onExpired: function(data) {
|
|
63
|
+
console.log('QR expiré:', data);
|
|
64
|
+
}
|
|
47
65
|
});
|
|
48
66
|
```
|
|
49
67
|
|
|
50
|
-
### 2.
|
|
68
|
+
### 2. Génération QR avec WebSocket
|
|
51
69
|
|
|
52
70
|
```html
|
|
53
|
-
<div id="
|
|
71
|
+
<div id="qr-container"></div>
|
|
54
72
|
```
|
|
55
73
|
|
|
56
74
|
```javascript
|
|
57
|
-
|
|
58
|
-
|
|
75
|
+
// Génère QR et émet automatiquement un événement WebSocket
|
|
76
|
+
const result = await sunuid.generateQR('qr-container', {
|
|
77
|
+
metadata: {
|
|
78
|
+
customData: 'votre-donnée'
|
|
79
|
+
}
|
|
59
80
|
});
|
|
60
|
-
```
|
|
61
81
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
```html
|
|
65
|
-
<div id="kyc-qr-container"></div>
|
|
82
|
+
console.log('QR généré:', result.qrCodeUrl);
|
|
83
|
+
console.log('Service ID:', result.service_id);
|
|
66
84
|
```
|
|
67
85
|
|
|
86
|
+
### 3. Écoute des événements WebSocket
|
|
87
|
+
|
|
68
88
|
```javascript
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
89
|
+
// Le SDK se connecte automatiquement au WebSocket
|
|
90
|
+
// Événements disponibles :
|
|
91
|
+
// - qr_status_update : Mise à jour du statut
|
|
92
|
+
// - qr_scan_success : Scan réussi
|
|
93
|
+
// - qr_expired : QR expiré
|
|
94
|
+
|
|
95
|
+
// Émettre un événement personnalisé
|
|
96
|
+
sunuid.emitWebSocketEvent('custom_event', {
|
|
97
|
+
message: 'Hello WebSocket!',
|
|
98
|
+
timestamp: Date.now()
|
|
72
99
|
});
|
|
100
|
+
|
|
101
|
+
// Vérifier le statut WebSocket
|
|
102
|
+
const status = sunuid.getWebSocketStatus(); // 'connected', 'disconnected', 'not_initialized'
|
|
73
103
|
```
|
|
74
104
|
|
|
75
105
|
## 🎨 Exemples
|
|
76
106
|
|
|
77
|
-
### Page de Connexion
|
|
107
|
+
### Page de Connexion avec WebSocket
|
|
78
108
|
|
|
79
109
|
```html
|
|
80
110
|
<!DOCTYPE html>
|
|
@@ -83,7 +113,7 @@ sunuid.generateKYCQR('kyc-qr-container', {
|
|
|
83
113
|
<meta charset="UTF-8">
|
|
84
114
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
85
115
|
<title>Connexion - Mon Application</title>
|
|
86
|
-
<link rel="stylesheet" href="https://unpkg.com/sunuid-sdk@1.0.
|
|
116
|
+
<link rel="stylesheet" href="https://unpkg.com/sunuid-sdk@1.0.23/dist/sunuid-sdk.css">
|
|
87
117
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
|
|
88
118
|
</head>
|
|
89
119
|
<body>
|
|
@@ -91,7 +121,7 @@ sunuid.generateKYCQR('kyc-qr-container', {
|
|
|
91
121
|
<h1>Connexion Sécurisée</h1>
|
|
92
122
|
<p>Scannez le QR code avec l'application SunuID</p>
|
|
93
123
|
|
|
94
|
-
<div id="
|
|
124
|
+
<div id="qr-container"></div>
|
|
95
125
|
|
|
96
126
|
<div class="login-footer">
|
|
97
127
|
<p>Pas encore d'application SunuID ?</p>
|
|
@@ -99,22 +129,37 @@ sunuid.generateKYCQR('kyc-qr-container', {
|
|
|
99
129
|
</div>
|
|
100
130
|
</div>
|
|
101
131
|
|
|
102
|
-
|
|
132
|
+
<!-- Socket.IO requis -->
|
|
133
|
+
<script src="https://cdn.socket.io/4.7.0/socket.io.min.js"></script>
|
|
134
|
+
|
|
135
|
+
<!-- SDK SunuID -->
|
|
136
|
+
<script src="https://unpkg.com/sunuid-sdk@1.0.23/dist/sunuid-sdk.js"></script>
|
|
137
|
+
|
|
103
138
|
<script>
|
|
104
139
|
const sunuid = initSunuID({
|
|
105
|
-
apiUrl: 'https://sunuid.fayma.sn
|
|
140
|
+
apiUrl: 'https://api.sunuid.fayma.sn',
|
|
106
141
|
clientId: 'VOTRE_CLIENT_ID',
|
|
107
142
|
secretId: 'VOTRE_SECRET_ID',
|
|
143
|
+
type: 1,
|
|
108
144
|
theme: 'light',
|
|
109
145
|
onSuccess: function(data) {
|
|
146
|
+
console.log('✅ Authentification réussie:', data);
|
|
110
147
|
window.location.href = '/dashboard?token=' + data.token;
|
|
111
148
|
},
|
|
112
149
|
onError: function(error) {
|
|
150
|
+
console.error('❌ Erreur:', error);
|
|
113
151
|
alert('Erreur de connexion: ' + error.message);
|
|
152
|
+
},
|
|
153
|
+
onStatusUpdate: function(data) {
|
|
154
|
+
console.log('📱 Mise à jour statut:', data);
|
|
155
|
+
},
|
|
156
|
+
onExpired: function(data) {
|
|
157
|
+
console.log('⏰ QR expiré:', data);
|
|
114
158
|
}
|
|
115
159
|
});
|
|
116
160
|
|
|
117
|
-
|
|
161
|
+
// Générer le QR code (WebSocket se connecte automatiquement)
|
|
162
|
+
sunuid.generateQR('qr-container');
|
|
118
163
|
</script>
|
|
119
164
|
</body>
|
|
120
165
|
</html>
|
|
@@ -126,33 +171,39 @@ sunuid.generateKYCQR('kyc-qr-container', {
|
|
|
126
171
|
|
|
127
172
|
| Option | Type | Défaut | Description |
|
|
128
173
|
|--------|------|--------|-------------|
|
|
129
|
-
| `apiUrl` | string | `'https://sunuid.fayma.sn
|
|
174
|
+
| `apiUrl` | string | `'https://api.sunuid.fayma.sn'` | URL de l'API SunuID |
|
|
130
175
|
| `clientId` | string | - | Clé client (requise) |
|
|
131
176
|
| `secretId` | string | - | Clé secrète (requise) |
|
|
177
|
+
| `type` | number | `1` | Type de service: `1` (auth), `2` (KYC), `3` (personnalisé) |
|
|
132
178
|
| `theme` | string | `'light'` | Thème: `'light'` ou `'dark'` |
|
|
133
179
|
| `language` | string | `'fr'` | Langue: `'fr'`, `'en'`, `'ar'` |
|
|
134
180
|
| `autoRefresh` | boolean | `true` | Actualisation automatique |
|
|
135
181
|
| `refreshInterval` | number | `30000` | Intervalle en millisecondes |
|
|
136
182
|
| `onSuccess` | function | - | Callback en cas de succès |
|
|
137
183
|
| `onError` | function | - | Callback en cas d'erreur |
|
|
184
|
+
| `onStatusUpdate` | function | - | Callback pour mises à jour WebSocket |
|
|
138
185
|
| `onExpired` | function | - | Callback quand le QR expire |
|
|
139
186
|
|
|
140
|
-
### Événements
|
|
187
|
+
### Événements WebSocket
|
|
141
188
|
|
|
142
189
|
```javascript
|
|
143
190
|
const sunuid = initSunuID({
|
|
144
191
|
// ... configuration
|
|
145
192
|
onSuccess: function(data) {
|
|
146
|
-
console.log('Authentification réussie:', data);
|
|
147
|
-
// data contient: token, user,
|
|
193
|
+
console.log('✅ Authentification réussie:', data);
|
|
194
|
+
// data contient: token, user, service_id, etc.
|
|
148
195
|
},
|
|
149
196
|
onError: function(error) {
|
|
150
|
-
console.error('Erreur:', error);
|
|
197
|
+
console.error('❌ Erreur:', error);
|
|
151
198
|
// error contient: message, code, details
|
|
152
199
|
},
|
|
153
|
-
|
|
154
|
-
console.log('
|
|
155
|
-
//
|
|
200
|
+
onStatusUpdate: function(data) {
|
|
201
|
+
console.log('📱 Mise à jour statut:', data);
|
|
202
|
+
// Mise à jour reçue via WebSocket
|
|
203
|
+
},
|
|
204
|
+
onExpired: function(data) {
|
|
205
|
+
console.log('⏰ QR expiré:', data);
|
|
206
|
+
// QR expiré, actualisation automatique
|
|
156
207
|
}
|
|
157
208
|
});
|
|
158
209
|
```
|
|
@@ -161,8 +212,23 @@ const sunuid = initSunuID({
|
|
|
161
212
|
|
|
162
213
|
### Méthodes principales
|
|
163
214
|
|
|
164
|
-
#### `
|
|
165
|
-
Génère un QR code
|
|
215
|
+
#### `generateQR(containerId, options)`
|
|
216
|
+
Génère un QR code avec le type configuré et émet un événement WebSocket.
|
|
217
|
+
|
|
218
|
+
```javascript
|
|
219
|
+
const result = await sunuid.generateQR('container-id', {
|
|
220
|
+
metadata: {
|
|
221
|
+
customData: 'votre-donnée',
|
|
222
|
+
timestamp: Date.now()
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
console.log('QR généré:', result.qrCodeUrl);
|
|
227
|
+
console.log('Service ID:', result.service_id);
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
#### `generateAuthQR(containerId, options)` (Alias)
|
|
231
|
+
Génère un QR code d'authentification (type 1).
|
|
166
232
|
|
|
167
233
|
```javascript
|
|
168
234
|
sunuid.generateAuthQR('container-id', {
|
|
@@ -172,8 +238,8 @@ sunuid.generateAuthQR('container-id', {
|
|
|
172
238
|
});
|
|
173
239
|
```
|
|
174
240
|
|
|
175
|
-
#### `generateKYCQR(containerId, options)`
|
|
176
|
-
Génère un QR code KYC.
|
|
241
|
+
#### `generateKYCQR(containerId, options)` (Alias)
|
|
242
|
+
Génère un QR code KYC (type 2).
|
|
177
243
|
|
|
178
244
|
```javascript
|
|
179
245
|
sunuid.generateKYCQR('container-id', {
|
|
@@ -184,45 +250,96 @@ sunuid.generateKYCQR('container-id', {
|
|
|
184
250
|
});
|
|
185
251
|
```
|
|
186
252
|
|
|
187
|
-
#### `checkQRStatus(
|
|
253
|
+
#### `checkQRStatus(serviceId)`
|
|
188
254
|
Vérifie le statut d'un QR code.
|
|
189
255
|
|
|
190
256
|
```javascript
|
|
191
|
-
const status = await sunuid.checkQRStatus('
|
|
257
|
+
const status = await sunuid.checkQRStatus('service-id-123');
|
|
192
258
|
console.log('Statut:', status);
|
|
193
259
|
```
|
|
194
260
|
|
|
195
|
-
#### `refreshQR(containerId,
|
|
261
|
+
#### `refreshQR(containerId, options)`
|
|
196
262
|
Actualise un QR code.
|
|
197
263
|
|
|
198
264
|
```javascript
|
|
199
|
-
sunuid.refreshQR('container-id',
|
|
265
|
+
sunuid.refreshQR('container-id', { theme: 'light' });
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Méthodes WebSocket
|
|
269
|
+
|
|
270
|
+
#### `getWebSocketStatus()`
|
|
271
|
+
Retourne le statut de la connexion WebSocket.
|
|
272
|
+
|
|
273
|
+
```javascript
|
|
274
|
+
const status = sunuid.getWebSocketStatus();
|
|
275
|
+
// 'connected', 'disconnected', 'not_initialized'
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
#### `emitWebSocketEvent(event, data)`
|
|
279
|
+
Émet un événement WebSocket personnalisé.
|
|
280
|
+
|
|
281
|
+
```javascript
|
|
282
|
+
sunuid.emitWebSocketEvent('custom_event', {
|
|
283
|
+
message: 'Hello WebSocket!',
|
|
284
|
+
timestamp: Date.now(),
|
|
285
|
+
serviceId: 'service-id'
|
|
286
|
+
});
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
#### `forceWebSocketInit()`
|
|
290
|
+
Force l'initialisation WebSocket si Socket.IO devient disponible plus tard.
|
|
291
|
+
|
|
292
|
+
```javascript
|
|
293
|
+
sunuid.forceWebSocketInit();
|
|
200
294
|
```
|
|
201
295
|
|
|
202
296
|
#### `destroy()`
|
|
203
|
-
Nettoie les ressources du SDK.
|
|
297
|
+
Nettoie les ressources du SDK et ferme la connexion WebSocket.
|
|
204
298
|
|
|
205
299
|
```javascript
|
|
206
300
|
sunuid.destroy();
|
|
207
301
|
```
|
|
208
302
|
|
|
303
|
+
## 🌐 WebSocket
|
|
304
|
+
|
|
305
|
+
### Connexion Automatique
|
|
306
|
+
Le SDK se connecte automatiquement au WebSocket lors de l'initialisation :
|
|
307
|
+
- **Serveur :** `wss://samasocket.fayma.sn:9443`
|
|
308
|
+
- **Paramètres :** token, type: 'web', userId, username
|
|
309
|
+
|
|
310
|
+
### Événements Reçus
|
|
311
|
+
- `qr_status_update` - Mise à jour du statut QR
|
|
312
|
+
- `qr_scan_success` - Scan QR réussi
|
|
313
|
+
- `qr_expired` - QR expiré
|
|
314
|
+
|
|
315
|
+
### Événements Émis
|
|
316
|
+
- `qr_generated` - QR généré (automatique)
|
|
317
|
+
- `custom_event` - Événements personnalisés
|
|
318
|
+
|
|
319
|
+
### Gestion des Erreurs
|
|
320
|
+
- Tentatives limitées (5 max) si Socket.IO non disponible
|
|
321
|
+
- Désactivation automatique après échec
|
|
322
|
+
- Logs détaillés pour le debugging
|
|
323
|
+
|
|
209
324
|
## 🛡️ Sécurité
|
|
210
325
|
|
|
211
326
|
### Authentification
|
|
212
327
|
Le SDK utilise les clés API pour s'authentifier :
|
|
213
|
-
- `
|
|
214
|
-
-
|
|
328
|
+
- `clientId` et `secretId` dans le corps des requêtes
|
|
329
|
+
- Connexion WebSocket sécurisée avec token
|
|
215
330
|
|
|
216
331
|
### Validation
|
|
217
332
|
- Vérification des paramètres requis
|
|
218
333
|
- Validation des URLs de redirection
|
|
219
334
|
- Protection contre les attaques CSRF
|
|
335
|
+
- Types numériques pour éviter les injections
|
|
220
336
|
|
|
221
337
|
## 🌐 Compatibilité
|
|
222
338
|
|
|
223
339
|
- **Navigateurs** : Chrome 60+, Firefox 55+, Safari 12+, Edge 79+
|
|
224
340
|
- **Mobile** : iOS Safari 12+, Chrome Mobile 60+
|
|
225
341
|
- **Node.js** : 14.0.0+
|
|
342
|
+
- **WebSocket** : Socket.IO 4.7.0+
|
|
226
343
|
|
|
227
344
|
## 📊 Monitoring
|
|
228
345
|
|
|
@@ -230,7 +347,9 @@ Le SDK utilise les clés API pour s'authentifier :
|
|
|
230
347
|
Le SDK génère des logs pour le debugging :
|
|
231
348
|
```javascript
|
|
232
349
|
console.log('SunuID SDK initialisé avec succès');
|
|
233
|
-
console.
|
|
350
|
+
console.log('🌐 WebSocket connecté avec succès');
|
|
351
|
+
console.log('📤 Événement WebSocket émis: qr_generated');
|
|
352
|
+
console.error('❌ Erreur connexion WebSocket:', error);
|
|
234
353
|
```
|
|
235
354
|
|
|
236
355
|
### Métriques
|
|
@@ -238,6 +357,7 @@ Les partenaires peuvent suivre :
|
|
|
238
357
|
- Nombre de QR codes générés
|
|
239
358
|
- Taux de succès d'authentification
|
|
240
359
|
- Temps de réponse de l'API
|
|
360
|
+
- Statut des connexions WebSocket
|
|
241
361
|
|
|
242
362
|
## 🆘 Support
|
|
243
363
|
|
|
@@ -293,6 +413,7 @@ Ce projet est distribué sous licence MIT. Voir le fichier [LICENSE](LICENSE) po
|
|
|
293
413
|
- [FontAwesome](https://fontawesome.com/) pour les icônes
|
|
294
414
|
- [Inter](https://rsms.me/inter/) pour la typographie
|
|
295
415
|
- [Rollup](https://rollupjs.org/) pour le bundling
|
|
416
|
+
- [Socket.IO](https://socket.io/) pour les WebSockets
|
|
296
417
|
|
|
297
418
|
---
|
|
298
419
|
|