sunuid-sdk 1.0.33 → 1.0.34
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 +171 -499
- package/dist/sunuid-sdk.esm.js +936 -367
- package/dist/sunuid-sdk.esm.js.map +1 -1
- package/dist/sunuid-sdk.js +936 -367
- package/dist/sunuid-sdk.js.map +1 -1
- package/dist/sunuid-sdk.min.js +3 -3
- package/dist/sunuid-sdk.min.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,602 +1,274 @@
|
|
|
1
|
-
#
|
|
1
|
+
# SunuID SDK JavaScript
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
[](https://opensource.org/licenses/MIT)
|
|
5
|
-
[](https://github.com/sunuid/sunuid-sdk/actions)
|
|
6
|
-
|
|
7
|
-
SDK JavaScript officiel pour intégrer facilement les QR codes d'authentification et KYC SunuID dans vos applications web.
|
|
8
|
-
|
|
9
|
-
## ✨ Fonctionnalités
|
|
10
|
-
|
|
11
|
-
- 🔐 **Authentification QR Code** - Connexion sécurisée avec SunuID
|
|
12
|
-
- 📋 **Vérification KYC** - Collecte et validation d'identité
|
|
13
|
-
- 🔒 **Mode Sécurisé** - Initialisation via PHP pour masquer les credentials
|
|
14
|
-
- 🌐 **WebSocket en Temps Réel** - Connexion automatique pour les mises à jour
|
|
15
|
-
- 🎨 **Thèmes personnalisables** - Support des thèmes clair et sombre
|
|
16
|
-
- 🔄 **Actualisation automatique** - QR codes qui se renouvellent automatiquement
|
|
17
|
-
- 📱 **Responsive design** - Compatible mobile et desktop
|
|
18
|
-
- 🌍 **Multi-langue** - Support français, anglais, arabe
|
|
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
|
|
3
|
+
SDK JavaScript officiel pour l'intégration des services d'authentification, KYC et signature électronique SunuID.
|
|
23
4
|
|
|
24
5
|
## 🚀 Installation
|
|
25
6
|
|
|
26
|
-
### Via
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
npm install sunuid-sdk
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Via CDN
|
|
33
|
-
|
|
7
|
+
### Via CDN (Recommandé)
|
|
34
8
|
```html
|
|
35
|
-
<!-- Socket.IO requis
|
|
36
|
-
<script src="https://cdn.socket.io/4.7.
|
|
9
|
+
<!-- Socket.IO (requis) -->
|
|
10
|
+
<script src="https://cdn.socket.io/4.7.4/socket.io.min.js"></script>
|
|
37
11
|
|
|
38
|
-
<!--
|
|
39
|
-
<
|
|
40
|
-
|
|
41
|
-
<!-- JavaScript -->
|
|
42
|
-
<script src="https://unpkg.com/sunuid-sdk@1.0.25/dist/sunuid-sdk.js"></script>
|
|
12
|
+
<!-- SunuID SDK -->
|
|
13
|
+
<script src="https://unpkg.com/sunuid-sdk@1.0.34/dist/sunuid-sdk.min.js"></script>
|
|
43
14
|
```
|
|
44
15
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
### 1. Mode Classique (Credentials visibles)
|
|
50
|
-
|
|
51
|
-
```javascript
|
|
52
|
-
const sunuid = initSunuID({
|
|
53
|
-
apiUrl: 'https://api.sunuid.fayma.sn',
|
|
54
|
-
clientId: 'VOTRE_CLIENT_ID',
|
|
55
|
-
secretId: 'VOTRE_SECRET_ID',
|
|
56
|
-
type: 2, // 1 = KYC, 2 = AUTH, 3 = SIGNATURE
|
|
57
|
-
theme: 'light',
|
|
58
|
-
onSuccess: function(data) {
|
|
59
|
-
console.log('Authentification réussie:', data);
|
|
60
|
-
},
|
|
61
|
-
onError: function(error) {
|
|
62
|
-
console.error('Erreur:', error);
|
|
63
|
-
},
|
|
64
|
-
onStatusUpdate: function(data) {
|
|
65
|
-
console.log('Mise à jour statut:', data);
|
|
66
|
-
},
|
|
67
|
-
onExpired: function(data) {
|
|
68
|
-
console.log('QR expiré:', data);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
16
|
+
### Via NPM
|
|
17
|
+
```bash
|
|
18
|
+
npm install sunuid-sdk
|
|
71
19
|
```
|
|
72
20
|
|
|
73
|
-
### 2. Mode Sécurisé (Credentials masqués)
|
|
74
|
-
|
|
75
21
|
```javascript
|
|
76
|
-
|
|
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
|
-
});
|
|
22
|
+
import SunuID from 'sunuid-sdk';
|
|
90
23
|
```
|
|
91
24
|
|
|
92
|
-
|
|
25
|
+
## 📦 Version actuelle
|
|
26
|
+
**v1.0.34** - Interface épurée et correction des appels répétitifs
|
|
93
27
|
|
|
94
|
-
|
|
95
|
-
<div id="qr-container"></div>
|
|
96
|
-
```
|
|
28
|
+
## 🎯 Utilisation rapide
|
|
97
29
|
|
|
30
|
+
### Configuration de base
|
|
98
31
|
```javascript
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
console.log('Service ID:', result.service_id);
|
|
32
|
+
const config = {
|
|
33
|
+
clientId: '1754166754_221A57B46843D755',
|
|
34
|
+
secretId: '56d40fe70507228b27f2640ae65894177c2fedbf246e2b30978fde1fc43953c5',
|
|
35
|
+
type: 2, // 1=KYC, 2=AUTH, 3=SIGNATURE
|
|
36
|
+
autoRefresh: false // Désactivé par défaut pour éviter les appels répétitifs
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const sunuid = new SunuID(config);
|
|
108
40
|
```
|
|
109
41
|
|
|
110
|
-
###
|
|
111
|
-
|
|
42
|
+
### Initialisation et génération QR
|
|
112
43
|
```javascript
|
|
113
|
-
//
|
|
114
|
-
|
|
115
|
-
// - qr_status_update : Mise à jour du statut
|
|
116
|
-
// - qr_scan_success : Scan réussi
|
|
117
|
-
// - qr_expired : QR expiré
|
|
118
|
-
|
|
119
|
-
// Émettre un événement personnalisé
|
|
120
|
-
sunuid.emitWebSocketEvent('custom_event', {
|
|
121
|
-
message: 'Hello WebSocket!',
|
|
122
|
-
timestamp: Date.now()
|
|
123
|
-
});
|
|
44
|
+
// Initialiser le SDK
|
|
45
|
+
await sunuid.init();
|
|
124
46
|
|
|
125
|
-
//
|
|
126
|
-
const
|
|
47
|
+
// Générer un QR code
|
|
48
|
+
const result = await sunuid.generateQR('qr-container');
|
|
49
|
+
console.log('QR Code généré:', result.qrCodeUrl);
|
|
127
50
|
```
|
|
128
51
|
|
|
129
|
-
##
|
|
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
|
-
];
|
|
52
|
+
## 🔧 Configuration
|
|
150
53
|
|
|
151
|
-
|
|
152
|
-
|
|
54
|
+
### Options disponibles
|
|
55
|
+
```javascript
|
|
56
|
+
const config = {
|
|
57
|
+
// API Configuration
|
|
58
|
+
apiUrl: 'https://api.sunuid.fayma.sn',
|
|
59
|
+
clientId: 'your-client-id',
|
|
60
|
+
secretId: 'your-secret-id',
|
|
61
|
+
type: 2, // Type de service
|
|
153
62
|
|
|
154
|
-
//
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
exit;
|
|
158
|
-
}
|
|
63
|
+
// Interface
|
|
64
|
+
theme: 'light', // 'light' ou 'dark'
|
|
65
|
+
language: 'fr',
|
|
159
66
|
|
|
160
|
-
//
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
];
|
|
67
|
+
// Rafraîchissement automatique
|
|
68
|
+
autoRefresh: false, // Désactivé par défaut
|
|
69
|
+
refreshInterval: 30000, // 30 secondes
|
|
172
70
|
|
|
173
|
-
|
|
71
|
+
// Sécurité
|
|
72
|
+
enableSecurityLogs: true,
|
|
73
|
+
validateInputs: true,
|
|
74
|
+
maxRetries: 3,
|
|
75
|
+
requestTimeout: 10000,
|
|
174
76
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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
|
-
?>
|
|
77
|
+
// Callbacks
|
|
78
|
+
onSuccess: (data) => console.log('Succès:', data),
|
|
79
|
+
onError: (error) => console.error('Erreur:', error),
|
|
80
|
+
onStatusUpdate: (status) => console.log('Statut:', status)
|
|
81
|
+
};
|
|
190
82
|
```
|
|
191
83
|
|
|
192
|
-
|
|
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
|
-
|
|
199
|
-
## 🎨 Exemples
|
|
200
|
-
|
|
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
|
|
84
|
+
## 📱 Types de services
|
|
212
85
|
|
|
213
|
-
|
|
86
|
+
| Type | Description | Utilisation |
|
|
87
|
+
|------|-------------|-------------|
|
|
88
|
+
| `1` | **KYC** | Vérification d'identité |
|
|
89
|
+
| `2` | **AUTH** | Authentification (défaut) |
|
|
90
|
+
| `3` | **SIGNATURE** | Signature électronique |
|
|
214
91
|
|
|
215
|
-
|
|
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
|
|
92
|
+
## 🔌 WebSocket
|
|
220
93
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
```html
|
|
224
|
-
<!DOCTYPE html>
|
|
225
|
-
<html lang="fr">
|
|
226
|
-
<head>
|
|
227
|
-
<meta charset="UTF-8">
|
|
228
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
229
|
-
<title>Connexion - Mon Application</title>
|
|
230
|
-
<link rel="stylesheet" href="https://unpkg.com/sunuid-sdk@1.0.25/dist/sunuid-sdk.css">
|
|
231
|
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
|
|
232
|
-
</head>
|
|
233
|
-
<body>
|
|
234
|
-
<div class="login-container">
|
|
235
|
-
<h1>Connexion Sécurisée</h1>
|
|
236
|
-
<p>Scannez le QR code avec l'application SunuID</p>
|
|
237
|
-
|
|
238
|
-
<div id="qr-container"></div>
|
|
239
|
-
|
|
240
|
-
<div class="login-footer">
|
|
241
|
-
<p>Pas encore d'application SunuID ?</p>
|
|
242
|
-
<a href="https://sunuid.sn/download" target="_blank">Télécharger</a>
|
|
243
|
-
</div>
|
|
244
|
-
</div>
|
|
245
|
-
|
|
246
|
-
<!-- Socket.IO requis -->
|
|
247
|
-
<script src="https://cdn.socket.io/4.7.0/socket.io.min.js"></script>
|
|
248
|
-
|
|
249
|
-
<!-- SDK SunuID -->
|
|
250
|
-
<script src="https://unpkg.com/sunuid-sdk@1.0.25/dist/sunuid-sdk.js"></script>
|
|
251
|
-
|
|
252
|
-
<script>
|
|
253
|
-
const sunuid = initSunuID({
|
|
254
|
-
apiUrl: 'https://api.sunuid.fayma.sn',
|
|
255
|
-
type: 2, // AUTH
|
|
256
|
-
secureInit: true, // Mode sécurisé
|
|
257
|
-
secureInitUrl: 'https://votre-serveur.com/secure-init.php',
|
|
258
|
-
theme: 'light',
|
|
259
|
-
partnerName: 'Mon Application',
|
|
260
|
-
onSuccess: function(data) {
|
|
261
|
-
console.log('✅ Authentification réussie:', data);
|
|
262
|
-
window.location.href = '/dashboard?token=' + data.token;
|
|
263
|
-
},
|
|
264
|
-
onError: function(error) {
|
|
265
|
-
console.error('❌ Erreur:', error);
|
|
266
|
-
alert('Erreur de connexion: ' + error.message);
|
|
267
|
-
},
|
|
268
|
-
onStatusUpdate: function(data) {
|
|
269
|
-
console.log('📱 Mise à jour statut:', data);
|
|
270
|
-
},
|
|
271
|
-
onExpired: function(data) {
|
|
272
|
-
console.log('⏰ QR expiré:', data);
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
// Générer le QR code (WebSocket se connecte automatiquement)
|
|
277
|
-
sunuid.generateQR('qr-container');
|
|
278
|
-
</script>
|
|
279
|
-
</body>
|
|
280
|
-
</html>
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
## 🔧 Configuration
|
|
284
|
-
|
|
285
|
-
### Options disponibles
|
|
286
|
-
|
|
287
|
-
| Option | Type | Défaut | Description |
|
|
288
|
-
|--------|------|--------|-------------|
|
|
289
|
-
| `apiUrl` | string | `'https://api.sunuid.fayma.sn'` | URL de l'API SunuID |
|
|
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) |
|
|
293
|
-
| `theme` | string | `'light'` | Thème: `'light'` ou `'dark'` |
|
|
294
|
-
| `language` | string | `'fr'` | Langue: `'fr'`, `'en'`, `'ar'` |
|
|
295
|
-
| `autoRefresh` | boolean | `true` | Actualisation automatique |
|
|
296
|
-
| `refreshInterval` | number | `30000` | Intervalle en millisecondes |
|
|
297
|
-
| `secureInit` | boolean | `false` | Active le mode sécurisé |
|
|
298
|
-
| `secureInitUrl` | string | `'https://api.sunuid.fayma.sn/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) |
|
|
304
|
-
| `onSuccess` | function | - | Callback en cas de succès |
|
|
305
|
-
| `onError` | function | - | Callback en cas d'erreur |
|
|
306
|
-
| `onStatusUpdate` | function | - | Callback pour mises à jour WebSocket |
|
|
307
|
-
| `onExpired` | function | - | Callback quand le QR expire |
|
|
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
|
-
|
|
317
|
-
### Événements WebSocket
|
|
94
|
+
Le SDK utilise Socket.IO pour la communication en temps réel :
|
|
318
95
|
|
|
319
96
|
```javascript
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
console.log('✅ Authentification réussie:', data);
|
|
324
|
-
// data contient: token, user, service_id, etc.
|
|
325
|
-
},
|
|
326
|
-
onError: function(error) {
|
|
327
|
-
console.error('❌ Erreur:', error);
|
|
328
|
-
// error contient: message, code, details
|
|
329
|
-
},
|
|
330
|
-
onStatusUpdate: function(data) {
|
|
331
|
-
console.log('📱 Mise à jour statut:', data);
|
|
332
|
-
// Mise à jour reçue via WebSocket
|
|
333
|
-
},
|
|
334
|
-
onExpired: function(data) {
|
|
335
|
-
console.log('⏰ QR expiré:', data);
|
|
336
|
-
// QR expiré, actualisation automatique
|
|
337
|
-
}
|
|
338
|
-
});
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
## 📱 API Référence
|
|
342
|
-
|
|
343
|
-
### Méthodes principales
|
|
344
|
-
|
|
345
|
-
#### `generateQR(containerId, options)`
|
|
346
|
-
Génère un QR code avec le type configuré et émet un événement WebSocket.
|
|
97
|
+
// Vérifier le statut WebSocket
|
|
98
|
+
const status = sunuid.getWebSocketStatus();
|
|
99
|
+
console.log('WebSocket connecté:', status.connected);
|
|
347
100
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
customData: 'votre-donnée',
|
|
352
|
-
timestamp: Date.now()
|
|
353
|
-
}
|
|
101
|
+
// Écouter les événements
|
|
102
|
+
sunuid.socket.on('qr_scanned', (data) => {
|
|
103
|
+
console.log('QR code scanné:', data);
|
|
354
104
|
});
|
|
355
|
-
|
|
356
|
-
console.log('QR généré:', result.qrCodeUrl);
|
|
357
|
-
console.log('Service ID:', result.service_id);
|
|
358
105
|
```
|
|
359
106
|
|
|
360
|
-
|
|
361
|
-
Génère un QR code KYC (type 1).
|
|
107
|
+
## 🎨 Interface personnalisée
|
|
362
108
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
redirectUrl: 'https://votre-site.com/kyc-complete'
|
|
369
|
-
});
|
|
109
|
+
### Conteneur personnalisé
|
|
110
|
+
```html
|
|
111
|
+
<div id="my-qr-container" class="custom-qr">
|
|
112
|
+
<!-- Le QR code sera affiché ici -->
|
|
113
|
+
</div>
|
|
370
114
|
```
|
|
371
115
|
|
|
372
|
-
#### `generateAuthQR(containerId, options)` (Alias)
|
|
373
|
-
Génère un QR code d'authentification (type 2).
|
|
374
|
-
|
|
375
116
|
```javascript
|
|
376
|
-
sunuid.
|
|
377
|
-
theme: 'light',
|
|
378
|
-
redirectUrl: 'https://votre-site.com/dashboard',
|
|
379
|
-
customData: { /* données personnalisées */ }
|
|
380
|
-
});
|
|
117
|
+
await sunuid.generateQR('my-qr-container');
|
|
381
118
|
```
|
|
382
119
|
|
|
383
|
-
|
|
384
|
-
Génère un QR code de signature (type 3) - **Non supporté par l'API**.
|
|
385
|
-
|
|
120
|
+
### Thème personnalisé
|
|
386
121
|
```javascript
|
|
387
|
-
|
|
122
|
+
const config = {
|
|
388
123
|
theme: 'dark',
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
});
|
|
124
|
+
// ... autres options
|
|
125
|
+
};
|
|
392
126
|
```
|
|
393
127
|
|
|
394
|
-
|
|
395
|
-
Vérifie le statut d'un QR code.
|
|
128
|
+
## 🔄 Contrôle du rafraîchissement
|
|
396
129
|
|
|
130
|
+
### Démarrer le rafraîchissement automatique
|
|
397
131
|
```javascript
|
|
398
|
-
|
|
399
|
-
console.log('Statut:', status);
|
|
132
|
+
sunuid.startAutoRefresh('qr-container', 2, {});
|
|
400
133
|
```
|
|
401
134
|
|
|
402
|
-
|
|
403
|
-
Actualise un QR code.
|
|
404
|
-
|
|
135
|
+
### Arrêter le rafraîchissement
|
|
405
136
|
```javascript
|
|
406
|
-
sunuid.
|
|
137
|
+
sunuid.stopAutoRefresh();
|
|
407
138
|
```
|
|
408
139
|
|
|
409
|
-
###
|
|
410
|
-
|
|
411
|
-
#### `getWebSocketStatus()`
|
|
412
|
-
Retourne le statut de la connexion WebSocket.
|
|
413
|
-
|
|
140
|
+
### Rafraîchissement manuel
|
|
414
141
|
```javascript
|
|
415
|
-
|
|
416
|
-
// 'connected', 'disconnected', 'not_initialized'
|
|
142
|
+
await sunuid.refreshQR('qr-container');
|
|
417
143
|
```
|
|
418
144
|
|
|
419
|
-
|
|
420
|
-
Émet un événement WebSocket personnalisé.
|
|
145
|
+
## 📊 API Reference
|
|
421
146
|
|
|
147
|
+
### Méthodes principales
|
|
148
|
+
|
|
149
|
+
#### `init()`
|
|
150
|
+
Initialise le SDK et établit les connexions.
|
|
422
151
|
```javascript
|
|
423
|
-
sunuid.
|
|
424
|
-
message: 'Hello WebSocket!',
|
|
425
|
-
timestamp: Date.now(),
|
|
426
|
-
serviceId: 'service-id'
|
|
427
|
-
});
|
|
152
|
+
await sunuid.init();
|
|
428
153
|
```
|
|
429
154
|
|
|
430
|
-
#### `
|
|
431
|
-
|
|
432
|
-
|
|
155
|
+
#### `generateQR(containerId, options)`
|
|
156
|
+
Génère et affiche un QR code.
|
|
433
157
|
```javascript
|
|
434
|
-
sunuid.
|
|
158
|
+
const result = await sunuid.generateQR('container-id', {
|
|
159
|
+
size: 300,
|
|
160
|
+
margin: 10
|
|
161
|
+
});
|
|
435
162
|
```
|
|
436
163
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
#### `getSecurityLogs()`
|
|
440
|
-
Récupère les logs de sécurité.
|
|
441
|
-
|
|
164
|
+
#### `getQRCode()`
|
|
165
|
+
Récupère l'URL du QR code généré.
|
|
442
166
|
```javascript
|
|
443
|
-
const
|
|
444
|
-
console.log('Logs de sécurité:', logs);
|
|
167
|
+
const qrUrl = sunuid.getQRCode();
|
|
445
168
|
```
|
|
446
169
|
|
|
447
|
-
#### `
|
|
448
|
-
|
|
449
|
-
|
|
170
|
+
#### `checkConnections()`
|
|
171
|
+
Vérifie l'état des connexions API et WebSocket.
|
|
450
172
|
```javascript
|
|
451
|
-
sunuid.
|
|
173
|
+
const status = await sunuid.checkConnections();
|
|
452
174
|
```
|
|
453
175
|
|
|
454
176
|
#### `destroy()`
|
|
455
|
-
Nettoie les ressources
|
|
456
|
-
|
|
177
|
+
Nettoie les ressources et ferme les connexions.
|
|
457
178
|
```javascript
|
|
458
179
|
sunuid.destroy();
|
|
459
180
|
```
|
|
460
181
|
|
|
461
|
-
##
|
|
182
|
+
## 🧪 Tests
|
|
462
183
|
|
|
463
|
-
###
|
|
464
|
-
|
|
465
|
-
- **Serveur :** `wss://samasocket.fayma.sn:9443`
|
|
466
|
-
- **Paramètres :** token, type: 'web', userId, username
|
|
184
|
+
### Page de test incluse
|
|
185
|
+
Ouvrir `test-sdk-simple.html` dans votre navigateur pour tester toutes les fonctionnalités.
|
|
467
186
|
|
|
468
|
-
###
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
### Gestion des Erreurs
|
|
478
|
-
- Tentatives limitées (5 max) si Socket.IO non disponible
|
|
479
|
-
- Désactivation automatique après échec
|
|
480
|
-
- Logs détaillés pour le debugging
|
|
187
|
+
### Test rapide
|
|
188
|
+
```javascript
|
|
189
|
+
// Test complet
|
|
190
|
+
const sunuid = new SunuID({
|
|
191
|
+
clientId: 'test-client',
|
|
192
|
+
secretId: 'test-secret',
|
|
193
|
+
type: 2
|
|
194
|
+
});
|
|
481
195
|
|
|
482
|
-
|
|
196
|
+
await sunuid.init();
|
|
197
|
+
const result = await sunuid.generateQR('test-container');
|
|
198
|
+
console.log('Test réussi:', result);
|
|
199
|
+
```
|
|
483
200
|
|
|
484
|
-
|
|
485
|
-
Le SDK utilise les clés API pour s'authentifier :
|
|
486
|
-
- `clientId` et `secretId` dans le corps des requêtes
|
|
487
|
-
- Connexion WebSocket sécurisée avec token
|
|
488
|
-
- Mode sécurisé avec tokens temporaires
|
|
201
|
+
## 🔒 Sécurité
|
|
489
202
|
|
|
490
|
-
###
|
|
491
|
-
-
|
|
492
|
-
-
|
|
493
|
-
-
|
|
494
|
-
-
|
|
495
|
-
-
|
|
496
|
-
-
|
|
203
|
+
### Fonctionnalités de sécurité
|
|
204
|
+
- ✅ Validation des paramètres d'entrée
|
|
205
|
+
- ✅ Sanitisation des données
|
|
206
|
+
- ✅ Logs de sécurité
|
|
207
|
+
- ✅ Gestion des timeouts
|
|
208
|
+
- ✅ Retry automatique
|
|
209
|
+
- ✅ Protection contre les appels répétitifs
|
|
497
210
|
|
|
498
|
-
###
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
211
|
+
### Logs de sécurité
|
|
212
|
+
```javascript
|
|
213
|
+
// Récupérer les logs de sécurité
|
|
214
|
+
const logs = sunuid.getSecurityLogs();
|
|
215
|
+
console.log('Logs de sécurité:', logs);
|
|
503
216
|
|
|
504
|
-
|
|
217
|
+
// Nettoyer les logs
|
|
218
|
+
sunuid.clearSecurityLogs();
|
|
219
|
+
```
|
|
505
220
|
|
|
506
|
-
|
|
507
|
-
- **Mobile** : iOS Safari 12+, Chrome Mobile 60+
|
|
508
|
-
- **Node.js** : 14.0.0+
|
|
509
|
-
- **WebSocket** : Socket.IO 4.7.0+
|
|
221
|
+
## 🐛 Dépannage
|
|
510
222
|
|
|
511
|
-
|
|
223
|
+
### Problèmes courants
|
|
512
224
|
|
|
513
|
-
|
|
514
|
-
Le SDK génère des logs pour le debugging :
|
|
225
|
+
#### "SDK non initialisé"
|
|
515
226
|
```javascript
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
console.log('📤 Événement WebSocket émis: qr_generated');
|
|
519
|
-
console.error('❌ Erreur connexion WebSocket:', error);
|
|
227
|
+
// Assurez-vous d'attendre l'initialisation
|
|
228
|
+
await sunuid.init();
|
|
520
229
|
```
|
|
521
230
|
|
|
522
|
-
|
|
231
|
+
#### "Connexions non disponibles"
|
|
523
232
|
```javascript
|
|
524
|
-
//
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
🔒 [SECURITY] API_REQUEST_START
|
|
528
|
-
🔒 [SECURITY] API_REQUEST_SUCCESS
|
|
233
|
+
// Vérifier les connexions
|
|
234
|
+
const status = await sunuid.checkConnections();
|
|
235
|
+
console.log('Statut connexions:', status);
|
|
529
236
|
```
|
|
530
237
|
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
## 🆘 Support
|
|
540
|
-
|
|
541
|
-
### Documentation
|
|
542
|
-
- [Guide d'intégration](https://docs.sunuid.sn)
|
|
543
|
-
- [API Reference](https://api.sunuid.sn/docs)
|
|
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)
|
|
547
|
-
|
|
548
|
-
### Support technique
|
|
549
|
-
- Email : support@sunuid.sn
|
|
550
|
-
- Chat : https://chat.sunuid.sn
|
|
551
|
-
- Documentation : https://docs.sunuid.sn
|
|
552
|
-
|
|
553
|
-
### Communauté
|
|
554
|
-
- [GitHub Issues](https://github.com/sunuid/sunuid-sdk/issues)
|
|
555
|
-
- [Discussions](https://github.com/sunuid/sunuid-sdk/discussions)
|
|
556
|
-
- [Stack Overflow](https://stackoverflow.com/questions/tagged/sunuid)
|
|
557
|
-
|
|
558
|
-
## 🤝 Contribution
|
|
559
|
-
|
|
560
|
-
Les contributions sont les bienvenues ! Consultez notre [guide de contribution](CONTRIBUTING.md).
|
|
561
|
-
|
|
562
|
-
### Développement
|
|
563
|
-
|
|
564
|
-
```bash
|
|
565
|
-
# Cloner le repository
|
|
566
|
-
git clone https://github.com/sunuid/sunuid-sdk.git
|
|
567
|
-
cd sunuid-sdk
|
|
238
|
+
#### Appels répétitifs à l'API
|
|
239
|
+
```javascript
|
|
240
|
+
// Désactiver le rafraîchissement automatique
|
|
241
|
+
const config = {
|
|
242
|
+
autoRefresh: false,
|
|
243
|
+
// ... autres options
|
|
244
|
+
};
|
|
245
|
+
```
|
|
568
246
|
|
|
569
|
-
|
|
570
|
-
npm install
|
|
247
|
+
## 📝 Changelog
|
|
571
248
|
|
|
572
|
-
|
|
573
|
-
|
|
249
|
+
### v1.0.27 (2025-01-06)
|
|
250
|
+
- ✅ **Interface épurée** : Suppression des textes d'instructions superflus
|
|
251
|
+
- ✅ **Correction des appels répétitifs** : Rafraîchissement automatique désactivé par défaut
|
|
252
|
+
- ✅ **Contrôle du rafraîchissement** : Méthodes `startAutoRefresh()` et `stopAutoRefresh()`
|
|
253
|
+
- ✅ **Gestion des timers** : Arrêt automatique des timers précédents
|
|
254
|
+
- ✅ **Page de test améliorée** : Contrôles pour le rafraîchissement automatique
|
|
574
255
|
|
|
575
|
-
|
|
576
|
-
|
|
256
|
+
### v1.0.26 (2025-01-06)
|
|
257
|
+
- ✅ **QR content simplifié** : Utilisation du socketID uniquement
|
|
258
|
+
- ✅ **Nom de partenaire dynamique** : Récupération depuis l'API
|
|
259
|
+
- ✅ **Service ID dynamique** : Récupération depuis l'API
|
|
260
|
+
- ✅ **Sélecteur de type** : Choix du type de service dans la page de test
|
|
577
261
|
|
|
578
|
-
|
|
579
|
-
npm test
|
|
262
|
+
## 🤝 Support
|
|
580
263
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
```
|
|
264
|
+
- **Email** : dev@sunuid.sn
|
|
265
|
+
- **Documentation** : https://docs.sunuid.sn
|
|
266
|
+
- **Issues** : https://github.com/sunuid/sunuid-sdk/issues
|
|
585
267
|
|
|
586
268
|
## 📄 Licence
|
|
587
269
|
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
## 🙏 Remerciements
|
|
591
|
-
|
|
592
|
-
- [FontAwesome](https://fontawesome.com/) pour les icônes
|
|
593
|
-
- [Inter](https://rsms.me/inter/) pour la typographie
|
|
594
|
-
- [Rollup](https://rollupjs.org/) pour le bundling
|
|
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
|
|
270
|
+
MIT License - Voir le fichier `LICENSE` pour plus de détails.
|
|
597
271
|
|
|
598
272
|
---
|
|
599
273
|
|
|
600
|
-
**
|
|
601
|
-
|
|
602
|
-
[](https://sunuid.sn)
|
|
274
|
+
**SunuID SDK** - SDK JavaScript officiel pour l'authentification et KYC SunuID 🚀
|