sunuid-sdk 1.0.51 → 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.
@@ -0,0 +1,309 @@
1
+ <?php
2
+
3
+ require_once __DIR__ . '/../vendor/autoload.php';
4
+
5
+ use SunuID\SunuID;
6
+ use SunuID\Exception\SunuIDException;
7
+
8
+ /**
9
+ * Exemple d'utilisation sécurisée du SDK PHP SunuID
10
+ *
11
+ * Cet exemple montre comment utiliser le SDK de manière sécurisée
12
+ * sans exposer les credentials dans le code.
13
+ */
14
+
15
+ // ========================================
16
+ // CONFIGURATION SÉCURISÉE
17
+ // ========================================
18
+
19
+ // Option 1: Configuration avec initialisation sécurisée (RECOMMANDÉE)
20
+ $secureConfig = [
21
+ 'type' => 2, // 1=KYC, 2=AUTH, 3=SIGNATURE
22
+ 'partner_name' => 'MonApplicationSécurisée',
23
+ 'theme' => 'light',
24
+ 'language' => 'fr',
25
+
26
+ // Activer l'initialisation sécurisée
27
+ 'secure_init' => true,
28
+ 'secure_init_url' => __DIR__ . '/../secure-init.php', // Chemin vers votre endpoint sécurisé
29
+
30
+ // Options de sécurité
31
+ 'enable_security_logs' => true,
32
+ 'validate_inputs' => true,
33
+ 'max_retries' => 3,
34
+ 'request_timeout' => 10,
35
+ 'token_max_age' => 300, // 5 minutes
36
+
37
+ // Logs
38
+ 'enable_logs' => true,
39
+ 'log_level' => \Monolog\Logger::INFO,
40
+ 'log_file' => 'sunuid-secure.log'
41
+ ];
42
+
43
+ // Option 2: Configuration traditionnelle (moins sécurisée)
44
+ $traditionalConfig = [
45
+ 'client_id' => '1754166754_221A57B46843D755',
46
+ 'secret_id' => '56d40fe70507228b27f2640ae65894177c2fedbf246e2b30978fde1fc43953c5',
47
+ 'type' => 2,
48
+ 'partner_name' => 'MonApplication',
49
+ 'enable_security_logs' => true,
50
+ 'validate_inputs' => true
51
+ ];
52
+
53
+ // ========================================
54
+ // FONCTIONS UTILITAIRES
55
+ // ========================================
56
+
57
+ /**
58
+ * Afficher les informations de sécurité
59
+ */
60
+ function displaySecurityInfo(SunuID $sunuid): void
61
+ {
62
+ echo "🔒 Informations de Sécurité:\n";
63
+ echo " - Initialisé: " . ($sunuid->isInitialized() ? '✅' : '❌') . "\n";
64
+ echo " - Configuration sécurisée: " . ($sunuid->getConfig()['secure_init'] ? '✅' : '❌') . "\n";
65
+ echo " - Logs de sécurité activés: " . ($sunuid->getConfig()['enable_security_logs'] ? '✅' : '❌') . "\n";
66
+ echo " - Validation des entrées: " . ($sunuid->getConfig()['validate_inputs'] ? '✅' : '❌') . "\n";
67
+
68
+ if ($sunuid->getConfig()['secure_init']) {
69
+ echo " - Token: " . ($sunuid->getConfig()['token'] ? '***' . substr($sunuid->getConfig()['token'], -8) : 'null') . "\n";
70
+ echo " - Expire dans: " . ($sunuid->getConfig()['expires_in'] ?? 'N/A') . " secondes\n";
71
+ echo " - Requêtes: " . $sunuid->getConfig()['request_count'] . "/" . ($sunuid->getConfig()['max_requests'] ?? '∞') . "\n";
72
+ }
73
+
74
+ echo "\n";
75
+ }
76
+
77
+ /**
78
+ * Afficher les logs de sécurité
79
+ */
80
+ function displaySecurityLogs(SunuID $sunuid): void
81
+ {
82
+ $logs = $sunuid->getSecurityLogs();
83
+
84
+ if (empty($logs)) {
85
+ echo "📝 Aucun log de sécurité disponible\n\n";
86
+ return;
87
+ }
88
+
89
+ echo "📝 Logs de Sécurité (" . count($logs) . " événements):\n";
90
+ foreach ($logs as $log) {
91
+ $level = str_contains($log['event'], 'ERROR') ? '❌' :
92
+ (str_contains($log['event'], 'SUCCESS') ? '✅' : 'ℹ️');
93
+
94
+ echo " {$level} {$log['timestamp']} - {$log['event']}\n";
95
+ if (!empty($log['data'])) {
96
+ echo " Données: " . json_encode($log['data']) . "\n";
97
+ }
98
+ }
99
+ echo "\n";
100
+ }
101
+
102
+ // ========================================
103
+ // EXEMPLE 1: UTILISATION SÉCURISÉE
104
+ // ========================================
105
+
106
+ echo "🚀 EXEMPLE 1: Utilisation Sécurisée\n";
107
+ echo "=====================================\n\n";
108
+
109
+ try {
110
+ // Créer l'instance SDK avec configuration sécurisée
111
+ $sunuid = new SunuID($secureConfig);
112
+
113
+ echo "✅ SDK créé avec configuration sécurisée\n";
114
+
115
+ // Initialiser le SDK (les credentials seront récupérés automatiquement)
116
+ $sunuid->init();
117
+
118
+ echo "✅ SDK initialisé de manière sécurisée\n";
119
+
120
+ // Afficher les informations de sécurité
121
+ displaySecurityInfo($sunuid);
122
+
123
+ // Récupérer les informations du partenaire
124
+ $partnerInfo = $sunuid->getPartnerInfo();
125
+ echo "📋 Informations partenaire: " . json_encode($partnerInfo, JSON_PRETTY_PRINT) . "\n\n";
126
+
127
+ // Générer un QR code d'authentification
128
+ echo "🎯 Génération QR code d'authentification...\n";
129
+ $qrResult = $sunuid->generateQR();
130
+
131
+ echo "✅ QR Code généré:\n";
132
+ echo " - URL: " . $qrResult['qr_code_url'] . "\n";
133
+ echo " - Contenu: " . $qrResult['content'] . "\n";
134
+ echo " - Session ID: " . $qrResult['session_id'] . "\n";
135
+ echo " - Label: " . $qrResult['label'] . "\n";
136
+ echo " - Type: " . $qrResult['type'] . "\n";
137
+ echo " - Partenaire: " . $qrResult['partner_name'] . "\n\n";
138
+
139
+ // Vérifier le statut du QR code
140
+ echo "📊 Vérification du statut du QR code...\n";
141
+ $status = $sunuid->checkQRStatus($qrResult['session_id']);
142
+ echo "📊 Statut QR: " . json_encode($status, JSON_PRETTY_PRINT) . "\n\n";
143
+
144
+ // Afficher les logs de sécurité
145
+ displaySecurityLogs($sunuid);
146
+
147
+ } catch (SunuIDException $e) {
148
+ echo "❌ Erreur SunuID: " . $e->getMessage() . "\n";
149
+ echo "📍 Code: " . $e->getErrorCode() . "\n";
150
+ echo "📍 Contexte: " . json_encode($e->getContext()) . "\n";
151
+ } catch (Exception $e) {
152
+ echo "❌ Erreur: " . $e->getMessage() . "\n";
153
+ echo "📍 Fichier: " . $e->getFile() . ":" . $e->getLine() . "\n";
154
+ }
155
+
156
+ // ========================================
157
+ // EXEMPLE 2: GÉNÉRATION DE DIFFÉRENTS TYPES
158
+ // ========================================
159
+
160
+ echo "\n🚀 EXEMPLE 2: Génération de Différents Types\n";
161
+ echo "==============================================\n\n";
162
+
163
+ try {
164
+ $sunuid = new SunuID($secureConfig);
165
+ $sunuid->init();
166
+
167
+ // Générer un QR code KYC
168
+ echo "📋 Génération QR code KYC...\n";
169
+ $kycQR = $sunuid->generateCustomQR(1, null, ['label' => 'Vérification d\'identité']);
170
+ echo "✅ QR KYC généré: " . $kycQR['qr_code_url'] . "\n\n";
171
+
172
+ // Générer un QR code de signature
173
+ echo "✍️ Génération QR code Signature...\n";
174
+ $signatureQR = $sunuid->generateCustomQR(3, null, ['label' => 'Signature électronique']);
175
+ echo "✅ QR Signature généré: " . $signatureQR['qr_code_url'] . "\n\n";
176
+
177
+ } catch (Exception $e) {
178
+ echo "❌ Erreur: " . $e->getMessage() . "\n";
179
+ }
180
+
181
+ // ========================================
182
+ // EXEMPLE 3: GESTION DES CALLBACKS
183
+ // ========================================
184
+
185
+ echo "\n🚀 EXEMPLE 3: Gestion des Callbacks\n";
186
+ echo "=====================================\n\n";
187
+
188
+ try {
189
+ $sunuid = new SunuID($secureConfig);
190
+ $sunuid->init();
191
+
192
+ // Générer un état de sécurité
193
+ $state = $sunuid->generateState();
194
+ echo "🔐 État de sécurité généré: " . $state . "\n";
195
+
196
+ // Simuler un callback (en production, cela viendrait de l'API SunuID)
197
+ $callbackData = [
198
+ 'token' => 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsInNlc3Npb25faWQiOiJzZXNzaW9uXzEyMyIsInBhcnRuZXJfaWQiOjIxLCJ0eXBlIjoyLCJpYXQiOjE2MzQ1Njc4OTAsImV4cCI6MTYzNDU3MTQ5MH0.signature',
199
+ 'session_id' => 'session_123',
200
+ 'user_id' => 123,
201
+ 'partner_id' => 21,
202
+ 'type' => 2,
203
+ 'timestamp' => time(),
204
+ 'state' => $state
205
+ ];
206
+
207
+ echo "📨 Simulation d'un callback reçu...\n";
208
+ echo "📋 Données callback: " . json_encode($callbackData, JSON_PRETTY_PRINT) . "\n\n";
209
+
210
+ // Valider le callback
211
+ $isValid = $sunuid->validateCallback($callbackData);
212
+ echo "🔍 Validation du callback: " . ($isValid ? '✅ Valide' : '❌ Invalide') . "\n";
213
+
214
+ if ($isValid) {
215
+ // Traiter l'authentification
216
+ $authResult = $sunuid->processAuthentication($callbackData);
217
+ echo "✅ Authentification traitée:\n";
218
+ echo " - User ID: " . $authResult['user_id'] . "\n";
219
+ echo " - Session ID: " . $authResult['session_id'] . "\n";
220
+ echo " - Partner ID: " . $authResult['partner_id'] . "\n";
221
+ echo " - Type: " . $authResult['type'] . "\n";
222
+ echo " - Timestamp: " . $authResult['timestamp'] . "\n\n";
223
+ }
224
+
225
+ } catch (Exception $e) {
226
+ echo "❌ Erreur: " . $e->getMessage() . "\n";
227
+ }
228
+
229
+ // ========================================
230
+ // EXEMPLE 4: GESTION DES ERREURS
231
+ // ========================================
232
+
233
+ echo "\n🚀 EXEMPLE 4: Gestion des Erreurs\n";
234
+ echo "===================================\n\n";
235
+
236
+ try {
237
+ // Configuration invalide pour tester la gestion d'erreurs
238
+ $invalidConfig = [
239
+ 'type' => 2,
240
+ 'secure_init' => false, // Pas d'initialisation sécurisée
241
+ 'client_id' => '', // Client ID vide
242
+ 'secret_id' => 'trop_court', // Secret ID trop court
243
+ 'enable_security_logs' => true
244
+ ];
245
+
246
+ echo "🧪 Test avec configuration invalide...\n";
247
+ $sunuid = new SunuID($invalidConfig);
248
+ $sunuid->init(); // Cela devrait lever une exception
249
+
250
+ } catch (SunuIDException $e) {
251
+ echo "❌ Erreur SunuID capturée:\n";
252
+ echo " - Message: " . $e->getMessage() . "\n";
253
+ echo " - Code: " . $e->getErrorCode() . "\n";
254
+ echo " - Contexte: " . json_encode($e->getContext()) . "\n\n";
255
+ } catch (Exception $e) {
256
+ echo "❌ Erreur générale: " . $e->getMessage() . "\n\n";
257
+ }
258
+
259
+ // ========================================
260
+ // EXEMPLE 5: UTILISATION AVEC VARIABLES D'ENVIRONNEMENT
261
+ // ========================================
262
+
263
+ echo "\n🚀 EXEMPLE 5: Utilisation avec Variables d'Environnement\n";
264
+ echo "==========================================================\n\n";
265
+
266
+ // En production, vous utiliseriez des variables d'environnement
267
+ // $_ENV['SUNUID_CLIENT_ID'] = 'votre_client_id';
268
+ // $_ENV['SUNUID_SECRET_ID'] = 'votre_secret_id';
269
+
270
+ try {
271
+ $envConfig = [
272
+ 'type' => 2,
273
+ 'partner_name' => 'AppProduction',
274
+ 'secure_init' => true,
275
+ 'secure_init_url' => __DIR__ . '/../secure-init.php',
276
+ 'enable_security_logs' => true,
277
+ 'validate_inputs' => true,
278
+ 'log_file' => 'sunuid-production.log'
279
+ ];
280
+
281
+ echo "🏭 Configuration production avec variables d'environnement...\n";
282
+ $sunuid = new SunuID($envConfig);
283
+ $sunuid->init();
284
+
285
+ echo "✅ SDK production initialisé\n";
286
+ displaySecurityInfo($sunuid);
287
+
288
+ } catch (Exception $e) {
289
+ echo "❌ Erreur production: " . $e->getMessage() . "\n";
290
+ }
291
+
292
+ // ========================================
293
+ // RÉSUMÉ FINAL
294
+ // ========================================
295
+
296
+ echo "\n🎯 RÉSUMÉ DES BONNES PRATIQUES\n";
297
+ echo "===============================\n";
298
+ echo "✅ Utilisez l'initialisation sécurisée (secure_init: true)\n";
299
+ echo "✅ Stockez les credentials côté serveur uniquement\n";
300
+ echo "✅ Activez les logs de sécurité\n";
301
+ echo "✅ Validez les entrées utilisateur\n";
302
+ echo "✅ Gérez les erreurs avec SunuIDException\n";
303
+ echo "✅ Utilisez des variables d'environnement en production\n";
304
+ echo "✅ Surveillez les logs de sécurité régulièrement\n";
305
+ echo "✅ Changez régulièrement vos credentials\n";
306
+ echo "✅ Testez votre implémentation avant la mise en production\n\n";
307
+
308
+ echo "🔒 Votre intégration SunuID est maintenant sécurisée !\n";
309
+
@@ -0,0 +1,95 @@
1
+ <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>KYC Simple - SunuID</title>
7
+
8
+ <!-- SunuID SDK -->
9
+ <script src="https://cdn.jsdelivr.net/npm/@sunuid/sdk@latest/dist/sunuid-sdk.min.js"></script>
10
+
11
+ <!-- QRCode library pour le fallback côté client -->
12
+ <script src="https://cdn.jsdelivr.net/npm/qrcode@1.5.3/lib/browser.min.js"></script>
13
+
14
+ <style>
15
+ body {
16
+ font-family: Arial, sans-serif;
17
+ display: flex;
18
+ justify-content: center;
19
+ align-items: center;
20
+ min-height: 100vh;
21
+ margin: 0;
22
+ background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
23
+ }
24
+ .kyc-card {
25
+ background: white;
26
+ padding: 40px;
27
+ border-radius: 15px;
28
+ box-shadow: 0 10px 30px rgba(0,0,0,0.2);
29
+ text-align: center;
30
+ max-width: 400px;
31
+ }
32
+ h1 { color: #333; margin-bottom: 10px; }
33
+ p { color: #666; margin-bottom: 30px; }
34
+ .success { color: #28a745; font-weight: bold; }
35
+ .error { color: #dc3545; font-weight: bold; }
36
+ </style>
37
+ </head>
38
+ <body>
39
+ <div class="kyc-card">
40
+ <h1>📋 Vérification KYC</h1>
41
+ <p>Scannez le QR code pour vérifier votre identité</p>
42
+
43
+ <div id="sunuid-qr"></div>
44
+
45
+ <div id="status"></div>
46
+
47
+ <p style="margin-top: 20px; font-size: 14px;">
48
+ Vérification sécurisée par SunuID
49
+ </p>
50
+ </div>
51
+
52
+ <script>
53
+ // Configuration KYC
54
+ const sunuid = initSunuID({
55
+ clientId: '1754174441_36C4685215935D1F',
56
+ secretId: 'e29c66f185c389eedf7a1e8a242aba741cd659deaa6a9f8d50aa2dec98cce49d',
57
+ type: 1, // KYC
58
+ theme: 'light',
59
+
60
+ // Callbacks
61
+ onSuccess: (data) => {
62
+ document.getElementById('status').innerHTML =
63
+ '<p class="success">✅ Vérification KYC réussie !</p>';
64
+ console.log('✅ KYC réussi:', data);
65
+
66
+ // Simuler une redirection
67
+ setTimeout(() => {
68
+ alert('Vérification KYC terminée avec succès !');
69
+ }, 1000);
70
+ },
71
+
72
+ onError: (error) => {
73
+ document.getElementById('status').innerHTML =
74
+ '<p class="error">❌ Erreur KYC: ' + error.message + '</p>';
75
+ console.error('❌ Erreur KYC:', error);
76
+ },
77
+
78
+ onStatusUpdate: (data) => {
79
+ document.getElementById('status').innerHTML =
80
+ '<p>📱 Statut KYC: ' + JSON.stringify(data) + '</p>';
81
+ console.log('📱 Statut KYC:', data);
82
+ },
83
+
84
+ onExpired: (data) => {
85
+ document.getElementById('status').innerHTML =
86
+ '<p>⏰ QR expiré, actualisation...</p>';
87
+ console.log('⏰ Expiré:', data);
88
+ }
89
+ });
90
+
91
+ // Générer le QR code KYC
92
+ sunuid.generateQR('sunuid-qr');
93
+ </script>
94
+ </body>
95
+ </html>
@@ -0,0 +1,96 @@
1
+ <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Connexion Simple - SunuID</title>
7
+
8
+ <!-- SunuID SDK -->
9
+ <script src="https://cdn.jsdelivr.net/npm/@sunuid/sdk@latest/dist/sunuid-sdk.min.js"></script>
10
+
11
+ <!-- QRCode library pour le fallback côté client -->
12
+ <script src="https://cdn.jsdelivr.net/npm/qrcode@1.5.3/lib/browser.min.js"></script>
13
+
14
+ <style>
15
+ body {
16
+ font-family: Arial, sans-serif;
17
+ display: flex;
18
+ justify-content: center;
19
+ align-items: center;
20
+ min-height: 100vh;
21
+ margin: 0;
22
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
23
+ }
24
+ .login-card {
25
+ background: white;
26
+ padding: 40px;
27
+ border-radius: 15px;
28
+ box-shadow: 0 10px 30px rgba(0,0,0,0.2);
29
+ text-align: center;
30
+ max-width: 400px;
31
+ }
32
+ h1 { color: #333; margin-bottom: 10px; }
33
+ p { color: #666; margin-bottom: 30px; }
34
+ .success { color: #28a745; font-weight: bold; }
35
+ .error { color: #dc3545; font-weight: bold; }
36
+ </style>
37
+ </head>
38
+ <body>
39
+ <div class="login-card">
40
+ <h1>🔐 Connexion Sécurisée</h1>
41
+ <p>Scannez le QR code avec l'application SunuID</p>
42
+
43
+ <div id="sunuid-qr"></div>
44
+
45
+ <div id="status"></div>
46
+
47
+ <p style="margin-top: 20px; font-size: 14px;">
48
+ Pas d'application SunuID ?
49
+ <a href="https://sunuid.sn/download" target="_blank">Télécharger</a>
50
+ </p>
51
+ </div>
52
+
53
+ <script>
54
+ // Configuration simple
55
+ const sunuid = initSunuID({
56
+ clientId: '1754174441_36C4685215935D1F',
57
+ secretId: 'e29c66f185c389eedf7a1e8a242aba741cd659deaa6a9f8d50aa2dec98cce49d',
58
+ type: 2, // Authentification
59
+ theme: 'light',
60
+
61
+ // Callbacks
62
+ onSuccess: (data) => {
63
+ document.getElementById('status').innerHTML =
64
+ '<p class="success">✅ Connexion réussie ! Redirection...</p>';
65
+ console.log('✅ Connexion réussie:', data);
66
+
67
+ // Simuler une redirection
68
+ setTimeout(() => {
69
+ alert('Bienvenue ! Vous êtes maintenant connecté.');
70
+ }, 1000);
71
+ },
72
+
73
+ onError: (error) => {
74
+ document.getElementById('status').innerHTML =
75
+ '<p class="error">❌ Erreur: ' + error.message + '</p>';
76
+ console.error('❌ Erreur:', error);
77
+ },
78
+
79
+ onStatusUpdate: (data) => {
80
+ document.getElementById('status').innerHTML =
81
+ '<p>📱 Statut: ' + JSON.stringify(data) + '</p>';
82
+ console.log('📱 Statut:', data);
83
+ },
84
+
85
+ onExpired: (data) => {
86
+ document.getElementById('status').innerHTML =
87
+ '<p>⏰ QR expiré, actualisation...</p>';
88
+ console.log('⏰ Expiré:', data);
89
+ }
90
+ });
91
+
92
+ // Générer le QR code
93
+ sunuid.generateQR('sunuid-qr');
94
+ </script>
95
+ </body>
96
+ </html>