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 +429 -193
- package/dist/sunuid-sdk.esm.js +6 -4
- package/dist/sunuid-sdk.esm.js.map +1 -1
- package/dist/sunuid-sdk.js +6 -4
- 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/docs/INTEGRATION_GUIDE.md +334 -0
- package/docs/SECURITY_GUIDE.md +368 -0
- package/examples/.htaccess.example +187 -0
- package/examples/README.md +192 -0
- package/examples/auto-code.js +234 -0
- package/examples/auto-integration.html +337 -0
- package/examples/basic-usage.php +42 -0
- package/examples/callback-example.html +232 -0
- package/examples/config-example.js +41 -0
- package/examples/demo.html +323 -0
- package/examples/env.example +83 -0
- package/examples/local-qr.php +49 -0
- package/examples/minimal-code.js +147 -0
- package/examples/minimal-integration.html +157 -0
- package/examples/no-loop-example.html +250 -0
- package/examples/partner-name-config.js +123 -0
- package/examples/production-config.js +60 -0
- package/examples/secure-integration-example.js +186 -0
- package/examples/secure-integration.html +410 -0
- package/examples/secure-usage.php +309 -0
- package/examples/simple-kyc.html +95 -0
- package/examples/simple-login.html +96 -0
- package/examples/test-partner-name.html +251 -0
- package/examples/test-production.html +200 -0
- package/examples/universal-kyc.html +199 -0
- package/examples/universal-login.html +148 -0
- package/examples/web-integration.php +138 -0
- package/package.json +24 -10
|
@@ -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>
|