sunuid-sdk 1.0.34 → 1.0.35
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 +499 -171
- package/dist/sunuid-sdk.esm.js +48 -2
- package/dist/sunuid-sdk.esm.js.map +1 -1
- package/dist/sunuid-sdk.js +48 -2
- package/dist/sunuid-sdk.js.map +1 -1
- package/dist/sunuid-sdk.min.js +1 -1
- package/dist/sunuid-sdk.min.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,274 +1,602 @@
|
|
|
1
|
-
# SunuID SDK
|
|
1
|
+
# 🔐 SunuID SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://badge.fury.io/js/sunuid-sdk)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://github.com/sunuid/sunuid-sdk/actions)
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
SDK JavaScript officiel pour intégrer facilement les QR codes d'authentification et KYC SunuID dans vos applications web.
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
```html
|
|
9
|
-
<!-- Socket.IO (requis) -->
|
|
10
|
-
<script src="https://cdn.socket.io/4.7.4/socket.io.min.js"></script>
|
|
9
|
+
## ✨ Fonctionnalités
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
|
23
|
+
|
|
24
|
+
## 🚀 Installation
|
|
15
25
|
|
|
16
26
|
### Via NPM
|
|
27
|
+
|
|
17
28
|
```bash
|
|
18
29
|
npm install sunuid-sdk
|
|
19
30
|
```
|
|
20
31
|
|
|
21
|
-
|
|
22
|
-
|
|
32
|
+
### Via CDN
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<!-- Socket.IO requis pour WebSocket -->
|
|
36
|
+
<script src="https://cdn.socket.io/4.7.0/socket.io.min.js"></script>
|
|
37
|
+
|
|
38
|
+
<!-- CSS -->
|
|
39
|
+
<link rel="stylesheet" href="https://unpkg.com/sunuid-sdk@1.0.25/dist/sunuid-sdk.css">
|
|
40
|
+
|
|
41
|
+
<!-- JavaScript -->
|
|
42
|
+
<script src="https://unpkg.com/sunuid-sdk@1.0.25/dist/sunuid-sdk.js"></script>
|
|
23
43
|
```
|
|
24
44
|
|
|
25
|
-
##
|
|
26
|
-
|
|
45
|
+
## 📖 Utilisation Rapide
|
|
46
|
+
|
|
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)** | **🏭 [Migration Production](MIGRATION_PRODUCTION.md)**
|
|
27
48
|
|
|
28
|
-
|
|
49
|
+
### 1. Mode Classique (Credentials visibles)
|
|
29
50
|
|
|
30
|
-
### Configuration de base
|
|
31
51
|
```javascript
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
+
});
|
|
40
71
|
```
|
|
41
72
|
|
|
42
|
-
###
|
|
73
|
+
### 2. Mode Sécurisé (Credentials masqués)
|
|
74
|
+
|
|
43
75
|
```javascript
|
|
44
|
-
|
|
45
|
-
|
|
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
|
|
46
93
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
console.log('QR Code généré:', result.qrCodeUrl);
|
|
94
|
+
```html
|
|
95
|
+
<div id="qr-container"></div>
|
|
50
96
|
```
|
|
51
97
|
|
|
52
|
-
|
|
98
|
+
```javascript
|
|
99
|
+
// Génère QR et émet automatiquement un événement WebSocket
|
|
100
|
+
const result = await sunuid.generateQR('qr-container', {
|
|
101
|
+
metadata: {
|
|
102
|
+
customData: 'votre-donnée'
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
console.log('QR généré:', result.qrCodeUrl);
|
|
107
|
+
console.log('Service ID:', result.service_id);
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 4. Écoute des événements WebSocket
|
|
53
111
|
|
|
54
|
-
### Options disponibles
|
|
55
112
|
```javascript
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
113
|
+
// Le SDK se connecte automatiquement au WebSocket
|
|
114
|
+
// Événements disponibles :
|
|
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
|
+
});
|
|
124
|
+
|
|
125
|
+
// Vérifier le statut WebSocket
|
|
126
|
+
const status = sunuid.getWebSocketStatus(); // 'connected', 'disconnected', 'not_initialized'
|
|
127
|
+
```
|
|
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);
|
|
62
153
|
|
|
63
|
-
//
|
|
64
|
-
|
|
65
|
-
|
|
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
|
+
}
|
|
66
159
|
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
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
|
+
];
|
|
70
172
|
|
|
71
|
-
|
|
72
|
-
enableSecurityLogs: true,
|
|
73
|
-
validateInputs: true,
|
|
74
|
-
maxRetries: 3,
|
|
75
|
-
requestTimeout: 10000,
|
|
173
|
+
$token = base64_encode(json_encode($payload));
|
|
76
174
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
+
?>
|
|
82
190
|
```
|
|
83
191
|
|
|
84
|
-
|
|
192
|
+
### Avantages du Mode Sécurisé
|
|
85
193
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
| `3` | **SIGNATURE** | Signature électronique |
|
|
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
|
|
91
198
|
|
|
92
|
-
##
|
|
199
|
+
## 🎨 Exemples
|
|
93
200
|
|
|
94
|
-
|
|
201
|
+
### Exemples Universels
|
|
95
202
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
console.log('WebSocket connecté:', status.connected);
|
|
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
|
|
100
206
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
106
212
|
|
|
107
|
-
|
|
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
|
-
### Conteneur personnalisé
|
|
110
223
|
```html
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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>
|
|
114
281
|
```
|
|
115
282
|
|
|
116
|
-
|
|
117
|
-
await sunuid.generateQR('my-qr-container');
|
|
118
|
-
```
|
|
283
|
+
## 🔧 Configuration
|
|
119
284
|
|
|
120
|
-
###
|
|
121
|
-
```javascript
|
|
122
|
-
const config = {
|
|
123
|
-
theme: 'dark',
|
|
124
|
-
// ... autres options
|
|
125
|
-
};
|
|
126
|
-
```
|
|
285
|
+
### Options disponibles
|
|
127
286
|
|
|
128
|
-
|
|
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
|
|
129
318
|
|
|
130
|
-
### Démarrer le rafraîchissement automatique
|
|
131
319
|
```javascript
|
|
132
|
-
sunuid
|
|
320
|
+
const sunuid = initSunuID({
|
|
321
|
+
// ... configuration
|
|
322
|
+
onSuccess: function(data) {
|
|
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
|
+
});
|
|
133
339
|
```
|
|
134
340
|
|
|
135
|
-
|
|
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.
|
|
347
|
+
|
|
136
348
|
```javascript
|
|
137
|
-
sunuid.
|
|
349
|
+
const result = await sunuid.generateQR('container-id', {
|
|
350
|
+
metadata: {
|
|
351
|
+
customData: 'votre-donnée',
|
|
352
|
+
timestamp: Date.now()
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
console.log('QR généré:', result.qrCodeUrl);
|
|
357
|
+
console.log('Service ID:', result.service_id);
|
|
138
358
|
```
|
|
139
359
|
|
|
140
|
-
|
|
360
|
+
#### `generateKYCQR(containerId, options)` (Alias)
|
|
361
|
+
Génère un QR code KYC (type 1).
|
|
362
|
+
|
|
141
363
|
```javascript
|
|
142
|
-
|
|
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
|
+
});
|
|
143
370
|
```
|
|
144
371
|
|
|
145
|
-
|
|
372
|
+
#### `generateAuthQR(containerId, options)` (Alias)
|
|
373
|
+
Génère un QR code d'authentification (type 2).
|
|
146
374
|
|
|
147
|
-
### Méthodes principales
|
|
148
|
-
|
|
149
|
-
#### `init()`
|
|
150
|
-
Initialise le SDK et établit les connexions.
|
|
151
375
|
```javascript
|
|
152
|
-
|
|
376
|
+
sunuid.generateAuthQR('container-id', {
|
|
377
|
+
theme: 'light',
|
|
378
|
+
redirectUrl: 'https://votre-site.com/dashboard',
|
|
379
|
+
customData: { /* données personnalisées */ }
|
|
380
|
+
});
|
|
153
381
|
```
|
|
154
382
|
|
|
155
|
-
#### `
|
|
156
|
-
Génère
|
|
383
|
+
#### `generateSignatureQR(containerId, options)` (Alias)
|
|
384
|
+
Génère un QR code de signature (type 3) - **Non supporté par l'API**.
|
|
385
|
+
|
|
157
386
|
```javascript
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
387
|
+
sunuid.generateSignatureQR('container-id', {
|
|
388
|
+
theme: 'dark',
|
|
389
|
+
documentId: 'doc-123',
|
|
390
|
+
signatureType: 'electronic'
|
|
161
391
|
});
|
|
162
392
|
```
|
|
163
393
|
|
|
164
|
-
#### `
|
|
165
|
-
|
|
394
|
+
#### `checkQRStatus(serviceId)`
|
|
395
|
+
Vérifie le statut d'un QR code.
|
|
396
|
+
|
|
166
397
|
```javascript
|
|
167
|
-
const
|
|
398
|
+
const status = await sunuid.checkQRStatus('service-id-123');
|
|
399
|
+
console.log('Statut:', status);
|
|
168
400
|
```
|
|
169
401
|
|
|
170
|
-
#### `
|
|
171
|
-
|
|
402
|
+
#### `refreshQR(containerId, options)`
|
|
403
|
+
Actualise un QR code.
|
|
404
|
+
|
|
172
405
|
```javascript
|
|
173
|
-
|
|
406
|
+
sunuid.refreshQR('container-id', { theme: 'light' });
|
|
174
407
|
```
|
|
175
408
|
|
|
176
|
-
|
|
177
|
-
|
|
409
|
+
### Méthodes WebSocket
|
|
410
|
+
|
|
411
|
+
#### `getWebSocketStatus()`
|
|
412
|
+
Retourne le statut de la connexion WebSocket.
|
|
413
|
+
|
|
178
414
|
```javascript
|
|
179
|
-
sunuid.
|
|
415
|
+
const status = sunuid.getWebSocketStatus();
|
|
416
|
+
// 'connected', 'disconnected', 'not_initialized'
|
|
180
417
|
```
|
|
181
418
|
|
|
182
|
-
|
|
419
|
+
#### `emitWebSocketEvent(event, data)`
|
|
420
|
+
Émet un événement WebSocket personnalisé.
|
|
183
421
|
|
|
184
|
-
### Page de test incluse
|
|
185
|
-
Ouvrir `test-sdk-simple.html` dans votre navigateur pour tester toutes les fonctionnalités.
|
|
186
|
-
|
|
187
|
-
### Test rapide
|
|
188
422
|
```javascript
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
type: 2
|
|
423
|
+
sunuid.emitWebSocketEvent('custom_event', {
|
|
424
|
+
message: 'Hello WebSocket!',
|
|
425
|
+
timestamp: Date.now(),
|
|
426
|
+
serviceId: 'service-id'
|
|
194
427
|
});
|
|
428
|
+
```
|
|
195
429
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
430
|
+
#### `forceWebSocketInit()`
|
|
431
|
+
Force l'initialisation WebSocket si Socket.IO devient disponible plus tard.
|
|
432
|
+
|
|
433
|
+
```javascript
|
|
434
|
+
sunuid.forceWebSocketInit();
|
|
199
435
|
```
|
|
200
436
|
|
|
201
|
-
|
|
437
|
+
### Méthodes de Sécurité
|
|
202
438
|
|
|
203
|
-
|
|
204
|
-
|
|
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
|
|
439
|
+
#### `getSecurityLogs()`
|
|
440
|
+
Récupère les logs de sécurité.
|
|
210
441
|
|
|
211
|
-
### Logs de sécurité
|
|
212
442
|
```javascript
|
|
213
|
-
// Récupérer les logs de sécurité
|
|
214
443
|
const logs = sunuid.getSecurityLogs();
|
|
215
444
|
console.log('Logs de sécurité:', logs);
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
#### `clearSecurityLogs()`
|
|
448
|
+
Efface les logs de sécurité.
|
|
216
449
|
|
|
217
|
-
|
|
450
|
+
```javascript
|
|
218
451
|
sunuid.clearSecurityLogs();
|
|
219
452
|
```
|
|
220
453
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
### Problèmes courants
|
|
454
|
+
#### `destroy()`
|
|
455
|
+
Nettoie les ressources du SDK et ferme la connexion WebSocket.
|
|
224
456
|
|
|
225
|
-
#### "SDK non initialisé"
|
|
226
457
|
```javascript
|
|
227
|
-
|
|
228
|
-
await sunuid.init();
|
|
458
|
+
sunuid.destroy();
|
|
229
459
|
```
|
|
230
460
|
|
|
231
|
-
|
|
461
|
+
## 🌐 WebSocket
|
|
462
|
+
|
|
463
|
+
### Connexion Automatique
|
|
464
|
+
Le SDK se connecte automatiquement au WebSocket lors de l'initialisation :
|
|
465
|
+
- **Serveur :** `wss://samasocket.fayma.sn:9443`
|
|
466
|
+
- **Paramètres :** token, type: 'web', userId, username
|
|
467
|
+
|
|
468
|
+
### Événements Reçus
|
|
469
|
+
- `qr_status_update` - Mise à jour du statut QR
|
|
470
|
+
- `qr_scan_success` - Scan QR réussi
|
|
471
|
+
- `qr_expired` - QR expiré
|
|
472
|
+
|
|
473
|
+
### Événements Émis
|
|
474
|
+
- `qr_generated` - QR généré (automatique)
|
|
475
|
+
- `custom_event` - Événements personnalisés
|
|
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
|
|
481
|
+
|
|
482
|
+
## 🛡️ Sécurité
|
|
483
|
+
|
|
484
|
+
### Authentification
|
|
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
|
|
489
|
+
|
|
490
|
+
### Validation
|
|
491
|
+
- Vérification des paramètres requis
|
|
492
|
+
- Validation des URLs de redirection
|
|
493
|
+
- Protection contre les attaques CSRF
|
|
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
|
|
503
|
+
|
|
504
|
+
## 🌐 Compatibilité
|
|
505
|
+
|
|
506
|
+
- **Navigateurs** : Chrome 60+, Firefox 55+, Safari 12+, Edge 79+
|
|
507
|
+
- **Mobile** : iOS Safari 12+, Chrome Mobile 60+
|
|
508
|
+
- **Node.js** : 14.0.0+
|
|
509
|
+
- **WebSocket** : Socket.IO 4.7.0+
|
|
510
|
+
|
|
511
|
+
## 📊 Monitoring
|
|
512
|
+
|
|
513
|
+
### Logs
|
|
514
|
+
Le SDK génère des logs pour le debugging :
|
|
232
515
|
```javascript
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
console.log('
|
|
516
|
+
console.log('SunuID SDK initialisé avec succès');
|
|
517
|
+
console.log('🌐 WebSocket connecté avec succès');
|
|
518
|
+
console.log('📤 Événement WebSocket émis: qr_generated');
|
|
519
|
+
console.error('❌ Erreur connexion WebSocket:', error);
|
|
236
520
|
```
|
|
237
521
|
|
|
238
|
-
|
|
522
|
+
### Logs de Sécurité
|
|
239
523
|
```javascript
|
|
240
|
-
//
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
|
245
529
|
```
|
|
246
530
|
|
|
247
|
-
|
|
531
|
+
### Métriques
|
|
532
|
+
Les partenaires peuvent suivre :
|
|
533
|
+
- Nombre de QR codes générés
|
|
534
|
+
- Taux de succès d'authentification
|
|
535
|
+
- Temps de réponse de l'API
|
|
536
|
+
- Statut des connexions WebSocket
|
|
537
|
+
- Utilisation du mode sécurisé
|
|
248
538
|
|
|
249
|
-
|
|
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
|
|
539
|
+
## 🆘 Support
|
|
255
540
|
|
|
256
|
-
###
|
|
257
|
-
-
|
|
258
|
-
-
|
|
259
|
-
-
|
|
260
|
-
-
|
|
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)
|
|
261
547
|
|
|
262
|
-
|
|
548
|
+
### Support technique
|
|
549
|
+
- Email : support@sunuid.sn
|
|
550
|
+
- Chat : https://chat.sunuid.sn
|
|
551
|
+
- Documentation : https://docs.sunuid.sn
|
|
263
552
|
|
|
264
|
-
|
|
265
|
-
-
|
|
266
|
-
-
|
|
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
|
|
568
|
+
|
|
569
|
+
# Installer les dépendances
|
|
570
|
+
npm install
|
|
571
|
+
|
|
572
|
+
# Démarrer le mode développement
|
|
573
|
+
npm run dev
|
|
574
|
+
|
|
575
|
+
# Construire pour la production
|
|
576
|
+
npm run build
|
|
577
|
+
|
|
578
|
+
# Lancer les tests
|
|
579
|
+
npm test
|
|
580
|
+
|
|
581
|
+
# Démarrer le serveur de démonstration
|
|
582
|
+
npm run serve
|
|
583
|
+
npm run demo
|
|
584
|
+
```
|
|
267
585
|
|
|
268
586
|
## 📄 Licence
|
|
269
587
|
|
|
270
|
-
|
|
588
|
+
Ce projet est distribué sous licence MIT. Voir le fichier [LICENSE](LICENSE) pour plus de détails.
|
|
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
|
|
271
597
|
|
|
272
598
|
---
|
|
273
599
|
|
|
274
|
-
**
|
|
600
|
+
**Développé avec ❤️ par l'équipe SunuID**
|
|
601
|
+
|
|
602
|
+
[](https://sunuid.sn)
|