sunuid-sdk 1.0.54 → 1.0.56
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 +20 -2
- package/dist/sunuid-sdk.esm.js +53 -33
- package/dist/sunuid-sdk.esm.js.map +1 -1
- package/dist/sunuid-sdk.js +53 -33
- 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 +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# 🔒 SunuID JavaScript SDK - Version 1.0.
|
|
1
|
+
# 🔒 SunuID JavaScript SDK - Version 1.0.54
|
|
2
2
|
|
|
3
3
|
SDK JavaScript sécurisé pour l'intégration des QR codes d'authentification et KYC SunuID.
|
|
4
4
|
|
|
@@ -17,7 +17,7 @@ npm install sunuid-sdk
|
|
|
17
17
|
<script src="https://cdn.socket.io/4.7.4/socket.io.min.js"></script>
|
|
18
18
|
|
|
19
19
|
<!-- SunuID SDK -->
|
|
20
|
-
<script src="https://unpkg.com/sunuid-sdk@1.0.
|
|
20
|
+
<script src="https://unpkg.com/sunuid-sdk@1.0.54/dist/sunuid-sdk.min.js"></script>
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
### Via Yarn
|
|
@@ -439,6 +439,24 @@ npm run test:coverage
|
|
|
439
439
|
npm run security-check
|
|
440
440
|
```
|
|
441
441
|
|
|
442
|
+
## 🆕 Dernières Améliorations (v1.0.54)
|
|
443
|
+
|
|
444
|
+
### 🔄 Dépendances Mises à Jour
|
|
445
|
+
- **Rollup** : 3.x → 4.x (performance améliorée)
|
|
446
|
+
- **ESLint** : 8.x → 9.x (nouvelles règles de sécurité)
|
|
447
|
+
- **Jest** : 29.x → 30.x (tests modernisés)
|
|
448
|
+
- **Plugins Rollup** : Versions les plus récentes
|
|
449
|
+
|
|
450
|
+
### 🚀 Améliorations de Performance
|
|
451
|
+
- Build plus rapide avec Rollup 4.x
|
|
452
|
+
- Meilleure optimisation du code
|
|
453
|
+
- Support amélioré des navigateurs modernes
|
|
454
|
+
|
|
455
|
+
### 🛡️ Sécurité Renforcée
|
|
456
|
+
- ESLint 9.x avec nouvelles règles de sécurité
|
|
457
|
+
- Validation des entrées améliorée
|
|
458
|
+
- Logs de sécurité plus détaillés
|
|
459
|
+
|
|
442
460
|
## 📚 Documentation
|
|
443
461
|
|
|
444
462
|
- [Guide de Sécurisation](docs/SECURITY_GUIDE.md)
|
package/dist/sunuid-sdk.esm.js
CHANGED
|
@@ -478,7 +478,7 @@ function _unsupportedIterableToArray(r, a) {
|
|
|
478
478
|
key: "secureInit",
|
|
479
479
|
value: (function () {
|
|
480
480
|
var _secureInit = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
|
|
481
|
-
var initData, response, result, decodedToken, _t2;
|
|
481
|
+
var _result$response, _result$response2, _result$data, _result$response3, _result$data2, _result$response4, _result$data3, initData, response, result, token, decodedToken, clientId, secretId, apiUrl, _t2;
|
|
482
482
|
return _regenerator().w(function (_context3) {
|
|
483
483
|
while (1) switch (_context3.p = _context3.n) {
|
|
484
484
|
case 0:
|
|
@@ -517,44 +517,56 @@ function _unsupportedIterableToArray(r, a) {
|
|
|
517
517
|
}
|
|
518
518
|
throw new Error(result.error || 'Erreur lors de l\'initialisation sécurisée');
|
|
519
519
|
case 4:
|
|
520
|
-
//
|
|
521
|
-
|
|
522
|
-
|
|
520
|
+
// Extraire le token depuis différents chemins possibles
|
|
521
|
+
token = (result === null || result === void 0 || (_result$response = result.response) === null || _result$response === void 0 || (_result$response = _result$response.response) === null || _result$response === void 0 ? void 0 : _result$response.token) || (result === null || result === void 0 || (_result$response2 = result.response) === null || _result$response2 === void 0 ? void 0 : _result$response2.token) || (result === null || result === void 0 || (_result$data = result.data) === null || _result$data === void 0 ? void 0 : _result$data.token) || (result === null || result === void 0 ? void 0 : result.token);
|
|
522
|
+
if (!(!token || typeof token !== 'string')) {
|
|
523
|
+
_context3.n = 5;
|
|
524
|
+
break;
|
|
525
|
+
}
|
|
526
|
+
throw new Error('Token non trouvé dans la réponse');
|
|
527
|
+
case 5:
|
|
528
|
+
// Stocker le token
|
|
529
|
+
this.config.token = token;
|
|
523
530
|
|
|
524
531
|
// Décoder le token pour récupérer les credentials
|
|
525
|
-
decodedToken = this.decodeSecureToken(
|
|
532
|
+
decodedToken = this.decodeSecureToken(token);
|
|
526
533
|
if (!decodedToken) {
|
|
527
|
-
_context3.n =
|
|
534
|
+
_context3.n = 6;
|
|
528
535
|
break;
|
|
529
536
|
}
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
537
|
+
clientId = decodedToken.clientId || decodedToken.client_id;
|
|
538
|
+
secretId = decodedToken.secretId || decodedToken.secret_id;
|
|
539
|
+
apiUrl = decodedToken.apiUrl || decodedToken.api_url;
|
|
540
|
+
if (clientId) this.config.clientId = clientId;
|
|
541
|
+
if (secretId) this.config.secretId = secretId;
|
|
542
|
+
if (apiUrl) this.config.apiUrl = apiUrl;
|
|
543
|
+
_context3.n = 7;
|
|
533
544
|
break;
|
|
534
|
-
case 5:
|
|
535
|
-
throw new Error('Impossible de décoder le token sécurisé');
|
|
536
545
|
case 6:
|
|
537
|
-
|
|
538
|
-
|
|
546
|
+
throw new Error('Impossible de décoder le token sécurisé');
|
|
547
|
+
case 7:
|
|
548
|
+
// Récupérer expiration et limites depuis la réponse si présentes
|
|
549
|
+
this.config.expiresIn = (result === null || result === void 0 || (_result$response3 = result.response) === null || _result$response3 === void 0 ? void 0 : _result$response3.expires_in) || (result === null || result === void 0 || (_result$data2 = result.data) === null || _result$data2 === void 0 ? void 0 : _result$data2.expires_in) || (result === null || result === void 0 ? void 0 : result.expires_in) || this.config.expiresIn;
|
|
550
|
+
this.config.maxRequests = (result === null || result === void 0 || (_result$response4 = result.response) === null || _result$response4 === void 0 ? void 0 : _result$response4.max_requests) || (result === null || result === void 0 || (_result$data3 = result.data) === null || _result$data3 === void 0 ? void 0 : _result$data3.max_requests) || (result === null || result === void 0 ? void 0 : result.max_requests) || this.config.maxRequests;
|
|
539
551
|
this.config.requestCount = 0;
|
|
540
552
|
this.logSecurityEvent('SECURE_INIT_SUCCESS', {
|
|
541
|
-
expiresIn:
|
|
542
|
-
maxRequests:
|
|
553
|
+
expiresIn: this.config.expiresIn,
|
|
554
|
+
maxRequests: this.config.maxRequests
|
|
543
555
|
});
|
|
544
556
|
console.log('✅ Initialisation sécurisée réussie');
|
|
545
|
-
_context3.n =
|
|
557
|
+
_context3.n = 9;
|
|
546
558
|
break;
|
|
547
|
-
case
|
|
548
|
-
_context3.p =
|
|
559
|
+
case 8:
|
|
560
|
+
_context3.p = 8;
|
|
549
561
|
_t2 = _context3.v;
|
|
550
562
|
this.logSecurityEvent('SECURE_INIT_ERROR', {
|
|
551
563
|
error: _t2.message
|
|
552
564
|
});
|
|
553
565
|
throw new Error("\xC9chec de l'initialisation s\xE9curis\xE9e: ".concat(_t2.message));
|
|
554
|
-
case
|
|
566
|
+
case 9:
|
|
555
567
|
return _context3.a(2);
|
|
556
568
|
}
|
|
557
|
-
}, _callee3, this, [[0,
|
|
569
|
+
}, _callee3, this, [[0, 8]]);
|
|
558
570
|
}));
|
|
559
571
|
function secureInit() {
|
|
560
572
|
return _secureInit.apply(this, arguments);
|
|
@@ -569,21 +581,29 @@ function _unsupportedIterableToArray(r, a) {
|
|
|
569
581
|
key: "decodeSecureToken",
|
|
570
582
|
value: function decodeSecureToken(token) {
|
|
571
583
|
try {
|
|
572
|
-
|
|
573
|
-
if (parts.length !== 2) {
|
|
574
|
-
console.error('❌ Format de token invalide');
|
|
575
|
-
return null;
|
|
576
|
-
}
|
|
577
|
-
var _parts = _slicedToArray(parts, 2),
|
|
578
|
-
payload = _parts[0],
|
|
579
|
-
signature = _parts[1];
|
|
584
|
+
if (!token || typeof token !== 'string') return null;
|
|
580
585
|
|
|
581
|
-
//
|
|
582
|
-
var
|
|
583
|
-
|
|
586
|
+
// Helper: décodage base64/base64url avec padding
|
|
587
|
+
var decodeBase64Any = function decodeBase64Any(str) {
|
|
588
|
+
var s = String(str).replace(/-/g, '+').replace(/_/g, '/');
|
|
589
|
+
while (s.length % 4 !== 0) s += '=';
|
|
590
|
+
return atob(s);
|
|
591
|
+
};
|
|
592
|
+
var tokenData = null;
|
|
593
|
+
if (token.includes('.')) {
|
|
594
|
+
// JWT-like: header.payload.signature ou header.payload
|
|
595
|
+
var parts = token.split('.');
|
|
596
|
+
var payloadPart = parts.length >= 2 ? parts[1] : parts[0];
|
|
597
|
+
var json = decodeBase64Any(payloadPart);
|
|
598
|
+
tokenData = JSON.parse(json);
|
|
599
|
+
} else {
|
|
600
|
+
// Base64("{json}") simple
|
|
601
|
+
var _json = decodeBase64Any(token);
|
|
602
|
+
tokenData = JSON.parse(_json);
|
|
603
|
+
}
|
|
584
604
|
|
|
585
|
-
// Vérifier l'expiration
|
|
586
|
-
if (tokenData.exp && tokenData.exp < Date.now() / 1000) {
|
|
605
|
+
// Vérifier l'expiration (en secondes)
|
|
606
|
+
if (tokenData && tokenData.exp && Number(tokenData.exp) < Math.floor(Date.now() / 1000)) {
|
|
587
607
|
console.error('❌ Token expiré');
|
|
588
608
|
return null;
|
|
589
609
|
}
|