sunuid-sdk 1.0.50 → 1.0.52

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
@@ -1,273 +1,509 @@
1
- # SunuID PHP SDK
1
+ # 🔒 SunuID JavaScript SDK - Version 1.0.52
2
2
 
3
- SDK PHP officiel pour l'intégration des QR codes d'authentification et KYC SunuID.
3
+ SDK JavaScript sécurisé pour l'intégration des QR codes d'authentification et KYC SunuID.
4
4
 
5
5
  ## 🚀 Installation
6
6
 
7
- ### Via Composer (recommandé)
7
+ ### Via NPM
8
8
 
9
9
  ```bash
10
- composer require sunuid/php-sdk
10
+ npm install sunuid-sdk
11
11
  ```
12
12
 
13
- ### Installation manuelle
13
+ ### Via CDN
14
+
15
+ ```html
16
+ <!-- Socket.IO (requis) -->
17
+ <script src="https://cdn.socket.io/4.7.4/socket.io.min.js"></script>
18
+
19
+ <!-- SunuID SDK -->
20
+ <script src="https://unpkg.com/sunuid-sdk@1.0.52/dist/sunuid-sdk.min.js"></script>
21
+ ```
22
+
23
+ ### Via Yarn
14
24
 
15
25
  ```bash
16
- git clone https://github.com/sunuid/php-sdk.git
17
- cd php-sdk
18
- composer install
26
+ yarn add sunuid-sdk
19
27
  ```
20
28
 
21
29
  ## 📋 Prérequis
22
30
 
23
- - PHP >= 7.4
24
- - Composer
25
- - Extensions PHP : `curl`, `json`, `openssl`
31
+ - Node.js >= 14.0.0
32
+ - Navigateur moderne avec support ES6+
33
+ - Socket.IO (inclus automatiquement)
26
34
 
27
35
  ## 🔧 Configuration
28
36
 
29
- ### Configuration de base
37
+ ### Configuration Sécurisée (Recommandée)
30
38
 
31
- ```php
32
- use SunuID\SunuID;
33
-
34
- $config = [
35
- 'client_id' => 'VOTRE_CLIENT_ID',
36
- 'secret_id' => 'VOTRE_SECRET_ID',
37
- 'type' => 2, // 1=KYC, 2=AUTH, 3=SIGNATURE
38
- 'enable_logs' => true,
39
- 'log_file' => 'sunuid.log'
40
- ];
39
+ ```javascript
40
+ // Configuration sécurisée (sans credentials exposés)
41
+ const secureConfig = {
42
+ type: 2, // 1=KYC, 2=AUTH, 3=SIGNATURE
43
+ partnerName: 'MonApplication',
44
+ theme: 'light',
45
+ language: 'fr',
46
+
47
+ // Activer l'initialisation sécurisée
48
+ secureInit: true,
49
+ secureInitUrl: '/secure-init.php', // Votre endpoint sécurisé
50
+
51
+ // Options de sécurité
52
+ enableSecurityLogs: true,
53
+ validateInputs: true,
54
+ maxRetries: 3,
55
+ requestTimeout: 10000,
56
+ tokenMaxAge: 300, // 5 minutes
57
+
58
+ // Callbacks
59
+ onSuccess: (data) => console.log('🎉 Succès:', data),
60
+ onError: (error) => console.error('💥 Erreur:', error),
61
+ onStatusUpdate: (status) => console.log('📊 Statut:', status)
62
+ };
63
+
64
+ // Créer et initialiser le SDK
65
+ const sunuid = new SunuID(secureConfig);
66
+ await sunuid.init(); // Les credentials sont récupérés automatiquement
67
+ ```
68
+
69
+ ### Configuration Traditionnelle (Moins Sécurisée)
41
70
 
42
- $sunuid = new SunuID($config);
43
- $sunuid->init();
71
+ ```javascript
72
+ const config = {
73
+ clientId: 'VOTRE_CLIENT_ID',
74
+ secretId: 'VOTRE_SECRET_ID',
75
+ type: 2,
76
+ partnerName: 'MonApplication',
77
+ enableSecurityLogs: true,
78
+ validateInputs: true
79
+ };
80
+
81
+ const sunuid = new SunuID(config);
82
+ await sunuid.init();
44
83
  ```
45
84
 
46
- ### Options de configuration
85
+ ## 🎯 Utilisation
47
86
 
48
- | Option | Type | Défaut | Description |
49
- |--------|------|--------|-------------|
50
- | `client_id` | string | null | ID client fourni par SunuID |
51
- | `secret_id` | string | null | Secret ID fourni par SunuID |
52
- | `type` | int | 2 | Type de service (1=KYC, 2=AUTH, 3=SIGNATURE) |
53
- | `api_url` | string | https://api.sunuid.fayma.sn | URL de l'API SunuID |
54
- | `enable_logs` | bool | true | Activer les logs |
55
- | `log_file` | string | sunuid.log | Fichier de log |
56
- | `request_timeout` | int | 10 | Timeout des requêtes en secondes |
57
- | `max_retries` | int | 3 | Nombre de tentatives en cas d'échec |
58
- | `secure_init` | bool | false | Utiliser l'initialisation sécurisée |
87
+ ### Génération de QR Codes
59
88
 
60
- ## 📖 Utilisation
89
+ ```javascript
90
+ // Générer un QR code d'authentification
91
+ const qrResult = await sunuid.generateQR('qr-container');
61
92
 
62
- ### Génération d'un QR code
93
+ console.log('QR Code URL:', qrResult.qrCodeUrl);
94
+ console.log('Session ID:', qrResult.sessionId);
95
+ console.log('Contenu:', qrResult.content);
63
96
 
64
- ```php
65
- try {
66
- $sunuid = new SunuID($config);
67
- $sunuid->init();
68
-
69
- // Générer un QR code
70
- $qrResult = $sunuid->generateQR();
71
-
72
- echo "QR Code URL: " . $qrResult['qr_code_url'] . "\n";
73
- echo "Session ID: " . $qrResult['session_id'] . "\n";
74
- echo "Contenu: " . $qrResult['content'] . "\n";
75
-
76
- } catch (Exception $e) {
77
- echo "Erreur: " . $e->getMessage() . "\n";
78
- }
79
- ```
97
+ // Générer un QR code KYC
98
+ const kycQR = await sunuid.generateKYCQR('qr-container');
80
99
 
81
- ### Génération d'un QR code local
100
+ // Générer un QR code de signature
101
+ const signatureQR = await sunuid.generateSignatureQR('qr-container');
82
102
 
83
- ```php
84
- // Générer un QR code sans API (local)
85
- $content = "AUTH_" . time() . "_" . bin2hex(random_bytes(8));
86
- $qrResult = $sunuid->generateQRLocal($content, [
87
- 'size' => 300,
88
- 'margin' => 10,
89
- 'label' => 'Authentification SunuID'
90
- ]);
91
-
92
- // L'image est retournée en base64
93
- $imageData = base64_decode(str_replace('data:image/png;base64,', '', $qrResult['qr_code_url']));
94
- file_put_contents('qr-code.png', $imageData);
103
+ // Générer un QR code personnalisé
104
+ const customQR = await sunuid.generateCustomQR(1, 'qr-container', {
105
+ label: 'Vérification d\'identité'
106
+ });
95
107
  ```
96
108
 
97
- ### Vérification du statut
109
+ ### Vérification du Statut
98
110
 
99
- ```php
111
+ ```javascript
100
112
  // Vérifier le statut d'un QR code
101
- $status = $sunuid->checkQRStatus($sessionId);
102
- echo "Statut: " . json_encode($status, JSON_PRETTY_PRINT) . "\n";
113
+ const status = await sunuid.checkQRStatus(qrResult.sessionId);
114
+ console.log('Statut:', status);
103
115
  ```
104
116
 
105
- ### Intégration web
117
+ ### Gestion des Callbacks
118
+
119
+ ```javascript
120
+ // Générer un état de sécurité
121
+ const state = sunuid.generateState();
122
+
123
+ // Valider un callback reçu
124
+ const callbackData = {
125
+ token: 'jwt_token_here',
126
+ session_id: 'session_123',
127
+ user_id: 123,
128
+ partner_id: 21,
129
+ type: 2,
130
+ timestamp: Date.now(),
131
+ state: state
132
+ };
133
+
134
+ if (sunuid.validateCallback(callbackData)) {
135
+ // Traiter l'authentification
136
+ const authResult = sunuid.processAuthentication(callbackData);
137
+ console.log('Authentification réussie pour l\'utilisateur:', authResult.user_id);
138
+ }
139
+ ```
106
140
 
107
- ```php
108
- <?php
109
- require_once 'vendor/autoload.php';
141
+ ## 🔒 Sécurité
110
142
 
111
- use SunuID\SunuID;
143
+ ### Initialisation Sécurisée
112
144
 
113
- $config = [
114
- 'client_id' => 'VOTRE_CLIENT_ID',
115
- 'secret_id' => 'VOTRE_SECRET_ID',
116
- 'type' => 2
117
- ];
145
+ Le SDK supporte l'initialisation sécurisée via un endpoint PHP qui génère des tokens temporaires :
118
146
 
119
- try {
120
- $sunuid = new SunuID($config);
121
- $sunuid->init();
122
- $qrData = $sunuid->generateQR();
123
- } catch (Exception $e) {
124
- $error = $e->getMessage();
125
- }
126
- ?>
147
+ ```php
148
+ // secure-init.php
149
+ <?php
150
+ $SUNUID_CONFIG = [
151
+ 'client_id' => $_ENV['SUNUID_CLIENT_ID'],
152
+ 'secret_id' => $_ENV['SUNUID_SECRET_ID'],
153
+ 'api_url' => 'https://api.sunuid.fayma.sn',
154
+ 'token_expiry' => 3600,
155
+ 'max_requests_per_token' => 100
156
+ ];
127
157
 
128
- <!DOCTYPE html>
129
- <html>
130
- <head>
131
- <title>SunuID QR Code</title>
132
- </head>
133
- <body>
134
- <?php if (isset($qrData)): ?>
135
- <h1>QR Code SunuID</h1>
136
- <img src="<?php echo htmlspecialchars($qrData['qr_code_url']); ?>"
137
- alt="QR Code SunuID" />
138
- <p>Session ID: <?php echo htmlspecialchars($qrData['session_id']); ?></p>
139
- <?php else: ?>
140
- <p>Erreur: <?php echo htmlspecialchars($error); ?></p>
141
- <?php endif; ?>
142
- </body>
143
- </html>
158
+ // Le SDK récupère automatiquement les credentials via ce token
144
159
  ```
145
160
 
146
- ## 🔍 Gestion des erreurs
147
-
148
- Le SDK utilise des exceptions spécifiques :
161
+ ### Logs de Sécurité
149
162
 
150
- ```php
151
- use SunuID\Exception\SunuIDException;
163
+ ```javascript
164
+ // Obtenir les logs de sécurité
165
+ const securityLogs = sunuid.getSecurityLogs();
166
+ securityLogs.forEach(log => {
167
+ console.log('Événement:', log.event, '-', log.timestamp);
168
+ });
152
169
 
153
- try {
154
- $sunuid = new SunuID($config);
155
- $sunuid->init();
156
- $qrResult = $sunuid->generateQR();
157
-
158
- } catch (SunuIDException $e) {
159
- echo "Erreur SunuID: " . $e->getMessage() . "\n";
160
- echo "Code d'erreur: " . $e->getErrorCode() . "\n";
161
- echo "Contexte: " . json_encode($e->getContext()) . "\n";
162
-
163
- } catch (Exception $e) {
164
- echo "Erreur générale: " . $e->getMessage() . "\n";
165
- }
170
+ // Nettoyer les logs
171
+ sunuid.clearSecurityLogs();
166
172
  ```
167
173
 
168
- ### Types d'exceptions
174
+ ### Validation des Entrées
175
+
176
+ ```javascript
177
+ // La validation est automatiquement activée avec validateInputs: true
178
+ // Le SDK valide :
179
+ // - Format des credentials
180
+ // - Longueur minimale des secrets
181
+ // - Validité des URLs
182
+ // - Types de services autorisés
183
+ ```
169
184
 
170
- - `SunuIDException::invalidConfig()` - Configuration invalide
171
- - `SunuIDException::initializationFailed()` - Échec d'initialisation
172
- - `SunuIDException::apiError()` - Erreur API
173
- - `SunuIDException::qrCodeError()` - Erreur QR code
174
- - `SunuIDException::authenticationError()` - Erreur d'authentification
175
- - `SunuIDException::networkError()` - Erreur réseau
185
+ ## 🌐 WebSocket
176
186
 
177
- ## 📊 Logging
187
+ Le SDK inclut une gestion complète des WebSockets pour les mises à jour en temps réel :
178
188
 
179
- Le SDK utilise Monolog pour les logs :
189
+ ```javascript
190
+ // Statut de la connexion WebSocket
191
+ const wsStatus = sunuid.getWebSocketStatus();
192
+ console.log('WebSocket:', wsStatus); // 'connected', 'disconnected', 'not_initialized'
180
193
 
181
- ```php
182
- // Accéder au logger
183
- $logger = $sunuid->getLogger();
194
+ // Émettre un événement WebSocket
195
+ sunuid.emitWebSocketEvent('custom_event', { data: 'value' });
184
196
 
185
- // Les logs sont automatiquement écrits dans le fichier configuré
186
- // Niveau de log configurable : DEBUG, INFO, WARNING, ERROR
197
+ // Forcer l'initialisation WebSocket
198
+ sunuid.forceWebSocketInit();
187
199
  ```
188
200
 
189
- ## 🧪 Tests
201
+ ### Événements WebSocket
190
202
 
191
- ### Exécuter les tests
203
+ Le SDK écoute automatiquement ces événements :
192
204
 
193
- ```bash
194
- composer test
195
- ```
205
+ - `qr_status_update` - Mise à jour du statut QR
206
+ - `qr_scan_success` - Scan QR réussi
207
+ - `qr_expired` - QR expiré
208
+ - `qr_scan_initiated` - Scan QR initié
196
209
 
197
- ### Exemples d'utilisation
210
+ ## 🛠️ Gestion d'Erreurs
198
211
 
199
- ```bash
200
- # Exemple basique
201
- php examples/basic-usage.php
212
+ ```javascript
213
+ try {
214
+ const sunuid = new SunuID(config);
215
+ await sunuid.init();
216
+ const qrResult = await sunuid.generateQR('qr-container');
217
+
218
+ } catch (error) {
219
+ console.error('Erreur SunuID:', error.message);
220
+
221
+ if (error.name === 'SunuIDException') {
222
+ console.error('Code:', error.code);
223
+ console.error('Contexte:', error.context);
224
+ }
225
+ }
226
+ ```
202
227
 
203
- # Exemple QR local
204
- php examples/local-qr.php
228
+ ## 📊 Informations et Statut
205
229
 
206
- # Exemple web
207
- php -S localhost:8000 examples/web-integration.php
208
- ```
230
+ ```javascript
231
+ // Obtenir la configuration
232
+ const config = sunuid.getConfig();
209
233
 
210
- ## 📚 API Reference
234
+ // Obtenir les informations du partenaire
235
+ const partnerInfo = sunuid.getPartnerInfo();
211
236
 
212
- ### Méthodes principales
237
+ // Vérifier si le SDK est initialisé
238
+ if (sunuid.isInitialized) {
239
+ console.log('SDK prêt à l\'utilisation');
240
+ }
213
241
 
214
- #### `__construct(array $config = [])`
215
- Constructeur du SDK.
242
+ // Obtenir les logs de sécurité
243
+ const securityLogs = sunuid.getSecurityLogs();
244
+ ```
216
245
 
217
- #### `init(): bool`
218
- Initialise le SDK. Doit être appelé avant toute autre méthode.
246
+ ## 🔧 Configuration Avancée
219
247
 
220
- #### `generateQR(string $content = null, array $options = []): array`
221
- Génère un QR code via l'API SunuID.
248
+ ### Variables d'Environnement
222
249
 
223
- #### `generateQRLocal(string $content, array $options = []): array`
224
- Génère un QR code local sans API.
250
+ ```javascript
251
+ // En production, utilisez des variables d'environnement
252
+ const config = {
253
+ type: 2,
254
+ partnerName: process.env.SUNUID_PARTNER_NAME,
255
+ secureInit: true,
256
+ secureInitUrl: process.env.SUNUID_SECURE_INIT_URL,
257
+ enableSecurityLogs: true,
258
+ validateInputs: true
259
+ };
260
+ ```
225
261
 
226
- #### `checkQRStatus(string $sessionId): array`
227
- Vérifie le statut d'un QR code.
262
+ ### Configuration de Production
263
+
264
+ ```javascript
265
+ const prodConfig = {
266
+ type: 2,
267
+ partnerName: 'AppProduction',
268
+ secureInit: true,
269
+ secureInitUrl: '/api/secure-init',
270
+ enableSecurityLogs: true,
271
+ validateInputs: true,
272
+ requestTimeout: 15000,
273
+ maxRetries: 5,
274
+ tokenMaxAge: 180 // 3 minutes
275
+ };
276
+ ```
228
277
 
229
- ### Méthodes utilitaires
278
+ ## 📝 Exemples Complets
230
279
 
231
- #### `getConfig(): array`
232
- Retourne la configuration actuelle.
280
+ ### Exemple d'Intégration Web
233
281
 
234
- #### `getPartnerInfo(): array`
235
- Retourne les informations du partenaire.
282
+ ```html
283
+ <!DOCTYPE html>
284
+ <html>
285
+ <head>
286
+ <title>SunuID SDK - Intégration Sécurisée</title>
287
+ </head>
288
+ <body>
289
+ <div id="qr-container">
290
+ <!-- Le QR code sera affiché ici -->
291
+ </div>
292
+
293
+ <button onclick="initSunuID()">Générer QR Code</button>
294
+
295
+ <script src="https://cdn.socket.io/4.7.4/socket.io.min.js"></script>
296
+ <script src="https://unpkg.com/sunuid-sdk@2.0.0/dist/sunuid-sdk.min.js"></script>
297
+
298
+ <script>
299
+ const config = {
300
+ type: 2,
301
+ partnerName: 'MonApp',
302
+ secureInit: true,
303
+ secureInitUrl: '/secure-init.php',
304
+ onSuccess: (data) => {
305
+ console.log('🎉 Authentification réussie:', data);
306
+ document.getElementById('qr-container').innerHTML =
307
+ '<h2>✅ Authentification réussie !</h2>';
308
+ },
309
+ onError: (error) => {
310
+ console.error('💥 Erreur:', error);
311
+ document.getElementById('qr-container').innerHTML =
312
+ '<h2>❌ Erreur: ' + error.message + '</h2>';
313
+ }
314
+ };
315
+
316
+ async function initSunuID() {
317
+ try {
318
+ const sunuid = new SunuID(config);
319
+ await sunuid.init();
320
+ await sunuid.generateQR('qr-container');
321
+ } catch (error) {
322
+ console.error('Erreur:', error);
323
+ }
324
+ }
325
+ </script>
326
+ </body>
327
+ </html>
328
+ ```
236
329
 
237
- #### `isInitialized(): bool`
238
- Vérifie si le SDK est initialisé.
330
+ ### Exemple avec React
239
331
 
240
- #### `getLogger(): Logger`
241
- Retourne l'instance du logger.
332
+ ```jsx
333
+ import React, { useEffect, useState } from 'react';
334
+ import { SunuID } from 'sunuid-sdk';
242
335
 
243
- ## 🔒 Sécurité
336
+ function SunuIDComponent() {
337
+ const [qrUrl, setQrUrl] = useState(null);
338
+ const [error, setError] = useState(null);
339
+
340
+ useEffect(() => {
341
+ const initSDK = async () => {
342
+ const config = {
343
+ type: 2,
344
+ partnerName: 'ReactApp',
345
+ secureInit: true,
346
+ secureInitUrl: '/api/secure-init',
347
+ onSuccess: (data) => {
348
+ console.log('Authentification réussie:', data);
349
+ }
350
+ };
351
+
352
+ try {
353
+ const sunuid = new SunuID(config);
354
+ await sunuid.init();
355
+ const result = await sunuid.generateQR('qr-container');
356
+ setQrUrl(result.qrCodeUrl);
357
+ } catch (err) {
358
+ setError(err.message);
359
+ }
360
+ };
361
+
362
+ initSDK();
363
+ }, []);
364
+
365
+ if (error) return <div>Erreur: {error}</div>;
366
+ if (!qrUrl) return <div>Chargement...</div>;
367
+
368
+ return (
369
+ <div>
370
+ <h2>QR Code SunuID</h2>
371
+ <img src={qrUrl} alt="QR Code" />
372
+ </div>
373
+ );
374
+ }
375
+ ```
244
376
 
245
- - Les credentials sont automatiquement obfusqués dans les logs
246
- - Validation stricte des paramètres d'entrée
247
- - Support de l'initialisation sécurisée
248
- - Gestion des timeouts et retry automatique
249
- - Protection contre les injections
377
+ ### Exemple avec Vue.js
378
+
379
+ ```vue
380
+ <template>
381
+ <div>
382
+ <h2>QR Code SunuID</h2>
383
+ <div v-if="qrUrl">
384
+ <img :src="qrUrl" alt="QR Code" />
385
+ </div>
386
+ <div v-else-if="error">
387
+ <p>Erreur: {{ error }}</p>
388
+ </div>
389
+ <div v-else>
390
+ <p>Chargement...</p>
391
+ </div>
392
+ </div>
393
+ </template>
394
+
395
+ <script>
396
+ import { SunuID } from 'sunuid-sdk';
397
+
398
+ export default {
399
+ data() {
400
+ return {
401
+ qrUrl: null,
402
+ error: null
403
+ };
404
+ },
405
+ async mounted() {
406
+ const config = {
407
+ type: 2,
408
+ partnerName: 'VueApp',
409
+ secureInit: true,
410
+ secureInitUrl: '/api/secure-init',
411
+ onSuccess: (data) => {
412
+ console.log('Authentification réussie:', data);
413
+ }
414
+ };
415
+
416
+ try {
417
+ const sunuid = new SunuID(config);
418
+ await sunuid.init();
419
+ const result = await sunuid.generateQR('qr-container');
420
+ this.qrUrl = result.qrCodeUrl;
421
+ } catch (err) {
422
+ this.error = err.message;
423
+ }
424
+ }
425
+ };
426
+ </script>
427
+ ```
250
428
 
251
- ## 🌐 Support
429
+ ## 🧪 Tests
252
430
 
253
- - **Documentation** : https://docs.sunuid.sn
254
- - **Issues** : https://github.com/sunuid/php-sdk/issues
255
- - **Email** : dev@sunuid.sn
431
+ ```bash
432
+ # Exécuter les tests
433
+ npm test
256
434
 
257
- ## 📄 Licence
435
+ # Test avec couverture
436
+ npm run test:coverage
258
437
 
259
- Ce projet est sous licence MIT. Voir le fichier [LICENSE](LICENSE) pour plus de détails.
438
+ # Test de sécurité
439
+ npm run security-check
440
+ ```
260
441
 
261
- ## 🤝 Contribution
442
+ ## 📚 Documentation
443
+
444
+ - [Guide de Sécurisation](docs/SECURITY_GUIDE.md)
445
+ - [Guide d'Intégration](docs/INTEGRATION_GUIDE.md)
446
+ - [Exemples d'Utilisation](examples/)
447
+
448
+ ## 🔄 Migration depuis la Version 1.x
449
+
450
+ ### Changements Majeurs
451
+
452
+ 1. **Nouvelle Configuration Sécurisée**
453
+ ```javascript
454
+ // Avant (v1.x)
455
+ const config = { clientId: '...', secretId: '...' };
456
+
457
+ // Après (v2.0)
458
+ const config = { secureInit: true, secureInitUrl: '/secure-init.php' };
459
+ ```
460
+
461
+ 2. **Nouvelles Méthodes**
462
+ ```javascript
463
+ // Nouvelles méthodes disponibles
464
+ sunuid.getSecurityLogs();
465
+ sunuid.clearSecurityLogs();
466
+ sunuid.generateState();
467
+ sunuid.validateCallback(data);
468
+ sunuid.processAuthentication(data);
469
+ sunuid.getWebSocketStatus();
470
+ sunuid.emitWebSocketEvent(event, data);
471
+ ```
472
+
473
+ 3. **Gestion d'Erreurs Améliorée**
474
+ ```javascript
475
+ // Avant
476
+ catch (error)
477
+
478
+ // Après
479
+ catch (error) {
480
+ if (error.name === 'SunuIDException') {
481
+ console.error('Code:', error.code);
482
+ }
483
+ }
484
+ ```
485
+
486
+ ## 🛡️ Bonnes Pratiques
487
+
488
+ 1. **Utilisez toujours l'initialisation sécurisée** en production
489
+ 2. **Stockez les credentials côté serveur uniquement**
490
+ 3. **Activez les logs de sécurité** pour le monitoring
491
+ 4. **Validez tous les callbacks** reçus
492
+ 5. **Gérez les erreurs** avec try/catch
493
+ 6. **Surveillez les logs** régulièrement
494
+ 7. **Changez vos credentials** périodiquement
495
+ 8. **Utilisez HTTPS** en production
496
+
497
+ ## 📞 Support
498
+
499
+ - **Documentation** : https://sunuid.fayma.sn/docs
500
+ - **Issues** : https://github.com/sunuid/sunuid-sdk/issues
501
+ - **Email** : contact@sunuid.fayma.sn
262
502
 
263
- Les contributions sont les bienvenues ! Veuillez :
503
+ ## 📄 Licence
264
504
 
265
- 1. Fork le projet
266
- 2. Créer une branche pour votre fonctionnalité
267
- 3. Commiter vos changements
268
- 4. Pousser vers la branche
269
- 5. Ouvrir une Pull Request
505
+ MIT License - voir le fichier [LICENSE](LICENSE) pour plus de détails.
270
506
 
271
- ## 📋 Changelog
507
+ ---
272
508
 
273
- Voir le fichier [CHANGELOG.md](CHANGELOG.md) pour l'historique des versions.
509
+ **⚠️ Important** : La sécurité de vos credentials est de votre responsabilité. Suivez toujours les bonnes pratiques et testez votre implémentation avant la mise en production.