@naman_deep_singh/security 1.5.1 → 1.7.0
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 +3 -3
- package/dist/cjs/core/crypto/CryptoManger.js +107 -0
- package/dist/cjs/core/crypto/index.js +13 -26
- package/dist/cjs/core/index.js +44 -0
- package/dist/cjs/core/jwt/{jwtManager.js → JWTManager.js} +22 -22
- package/dist/cjs/core/jwt/decode.js +2 -3
- package/dist/cjs/core/jwt/generateTokens.js +8 -8
- package/dist/cjs/core/jwt/index.js +23 -22
- package/dist/cjs/core/jwt/parseDuration.js +3 -3
- package/dist/cjs/core/jwt/signToken.js +4 -4
- package/dist/cjs/core/jwt/validateToken.js +4 -4
- package/dist/cjs/core/jwt/verify.js +13 -13
- package/dist/cjs/core/password/{passwordManager.js → PasswordManager.js} +8 -8
- package/dist/cjs/core/password/hash.js +6 -6
- package/dist/cjs/core/password/index.js +20 -17
- package/dist/cjs/core/password/strength.js +7 -7
- package/dist/cjs/core/password/utils.js +2 -2
- package/dist/cjs/core/password/verify.js +5 -5
- package/dist/cjs/index.js +4 -40
- package/dist/cjs/interfaces/index.js +2 -0
- package/dist/esm/core/crypto/CryptoManger.js +100 -0
- package/dist/esm/core/crypto/index.js +5 -5
- package/dist/esm/core/index.js +6 -0
- package/dist/esm/core/jwt/{jwtManager.js → JWTManager.js} +4 -4
- package/dist/esm/core/jwt/decode.js +1 -2
- package/dist/esm/core/jwt/generateTokens.js +3 -3
- package/dist/esm/core/jwt/index.js +8 -8
- package/dist/esm/core/jwt/parseDuration.js +1 -1
- package/dist/esm/core/jwt/signToken.js +2 -2
- package/dist/esm/core/jwt/validateToken.js +1 -1
- package/dist/esm/core/jwt/verify.js +1 -1
- package/dist/esm/core/password/{passwordManager.js → PasswordManager.js} +2 -2
- package/dist/esm/core/password/hash.js +4 -4
- package/dist/esm/core/password/index.js +5 -3
- package/dist/esm/core/password/strength.js +1 -1
- package/dist/esm/core/password/utils.js +1 -1
- package/dist/esm/core/password/verify.js +1 -1
- package/dist/esm/index.js +4 -13
- package/dist/esm/interfaces/index.js +1 -0
- package/dist/types/core/crypto/CryptoManger.d.ts +36 -0
- package/dist/types/core/crypto/index.d.ts +5 -5
- package/dist/types/core/index.d.ts +3 -0
- package/dist/{esm/core/jwt/jwtManager.d.ts → types/core/jwt/JWTManager.d.ts} +1 -1
- package/dist/types/core/jwt/generateTokens.d.ts +1 -1
- package/dist/types/core/jwt/index.d.ts +9 -8
- package/dist/types/core/jwt/verify.d.ts +1 -1
- package/dist/types/core/password/{passwordManager.d.ts → PasswordManager.d.ts} +1 -1
- package/dist/types/core/password/index.d.ts +6 -3
- package/dist/types/core/password/strength.d.ts +1 -1
- package/dist/types/index.d.ts +1 -40
- package/dist/types/interfaces/index.d.ts +2 -0
- package/package.json +33 -4
- package/dist/cjs/core/crypto/cryptoManager.d.ts +0 -111
- package/dist/cjs/core/crypto/cryptoManager.js +0 -208
- package/dist/cjs/core/crypto/decrypt.d.ts +0 -1
- package/dist/cjs/core/crypto/encrypt.d.ts +0 -1
- package/dist/cjs/core/crypto/hmac.d.ts +0 -8
- package/dist/cjs/core/crypto/index.d.ts +0 -5
- package/dist/cjs/core/crypto/random.d.ts +0 -8
- package/dist/cjs/core/jwt/decode.d.ts +0 -12
- package/dist/cjs/core/jwt/extractToken.d.ts +0 -11
- package/dist/cjs/core/jwt/generateTokens.d.ts +0 -4
- package/dist/cjs/core/jwt/index.d.ts +0 -8
- package/dist/cjs/core/jwt/jwtManager.d.ts +0 -43
- package/dist/cjs/core/jwt/parseDuration.d.ts +0 -1
- package/dist/cjs/core/jwt/signToken.d.ts +0 -2
- package/dist/cjs/core/jwt/types.d.ts +0 -22
- package/dist/cjs/core/jwt/validateToken.d.ts +0 -16
- package/dist/cjs/core/jwt/verify.d.ts +0 -18
- package/dist/cjs/core/password/hash.d.ts +0 -10
- package/dist/cjs/core/password/index.d.ts +0 -3
- package/dist/cjs/core/password/passwordManager.d.ts +0 -29
- package/dist/cjs/core/password/strength.d.ts +0 -2
- package/dist/cjs/core/password/types.d.ts +0 -7
- package/dist/cjs/core/password/utils.d.ts +0 -16
- package/dist/cjs/core/password/verify.d.ts +0 -10
- package/dist/cjs/index.d.ts +0 -40
- package/dist/cjs/interfaces/jwt.interface.d.ts +0 -47
- package/dist/cjs/interfaces/password.interface.d.ts +0 -60
- package/dist/esm/core/crypto/cryptoManager.d.ts +0 -111
- package/dist/esm/core/crypto/cryptoManager.js +0 -203
- package/dist/esm/core/crypto/decrypt.d.ts +0 -1
- package/dist/esm/core/crypto/encrypt.d.ts +0 -1
- package/dist/esm/core/crypto/hmac.d.ts +0 -8
- package/dist/esm/core/crypto/index.d.ts +0 -5
- package/dist/esm/core/crypto/random.d.ts +0 -8
- package/dist/esm/core/jwt/decode.d.ts +0 -12
- package/dist/esm/core/jwt/extractToken.d.ts +0 -11
- package/dist/esm/core/jwt/generateTokens.d.ts +0 -4
- package/dist/esm/core/jwt/index.d.ts +0 -8
- package/dist/esm/core/jwt/parseDuration.d.ts +0 -1
- package/dist/esm/core/jwt/signToken.d.ts +0 -2
- package/dist/esm/core/jwt/types.d.ts +0 -22
- package/dist/esm/core/jwt/validateToken.d.ts +0 -16
- package/dist/esm/core/jwt/verify.d.ts +0 -18
- package/dist/esm/core/password/hash.d.ts +0 -10
- package/dist/esm/core/password/index.d.ts +0 -3
- package/dist/esm/core/password/passwordManager.d.ts +0 -29
- package/dist/esm/core/password/strength.d.ts +0 -2
- package/dist/esm/core/password/types.d.ts +0 -7
- package/dist/esm/core/password/utils.d.ts +0 -16
- package/dist/esm/core/password/verify.d.ts +0 -10
- package/dist/esm/index.d.ts +0 -40
- package/dist/esm/interfaces/jwt.interface.d.ts +0 -47
- package/dist/esm/interfaces/password.interface.d.ts +0 -60
- package/dist/types/core/crypto/cryptoManager.d.ts +0 -111
- package/dist/types/core/jwt/jwtManager.d.ts +0 -43
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
```bash
|
|
2
2
|
@naman_deep_singh/security
|
|
3
3
|
|
|
4
|
-
Version: 1.
|
|
4
|
+
Version: 1.7.0
|
|
5
5
|
|
|
6
6
|
A complete, lightweight security toolkit for Node.js & TypeScript providing:
|
|
7
7
|
|
|
@@ -13,7 +13,7 @@ A complete, lightweight security toolkit for Node.js & TypeScript providing:
|
|
|
13
13
|
🧰 Robust token extraction (Headers, Cookies, Query, Body, WebSocket)
|
|
14
14
|
🧩 Safe & strict JWT decode utilities
|
|
15
15
|
🔒 AES-256-GCM encryption/decryption with HMAC and random utilities
|
|
16
|
-
🚨 Standardized error handling with @naman_deep_singh/errors
|
|
16
|
+
🚨 Standardized error handling with @naman_deep_singh/errors
|
|
17
17
|
|
|
18
18
|
✔ Fully typed with TypeScript
|
|
19
19
|
✔ Branded token types for compile-time safety (AccessToken/RefreshToken)
|
|
@@ -220,7 +220,7 @@ const randomHex = cryptoManager.generateRandomHex(32);
|
|
|
220
220
|
|
|
221
221
|
🚨 Error Handling
|
|
222
222
|
|
|
223
|
-
This package uses standardized errors from @naman_deep_singh/errors
|
|
223
|
+
This package uses standardized errors from @naman_deep_singh/errors:
|
|
224
224
|
|
|
225
225
|
import {
|
|
226
226
|
BadRequestError,
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CryptoManager = void 0;
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const errors_1 = require("@naman_deep_singh/errors");
|
|
9
|
+
const decrypt_js_1 = require("./decrypt.js");
|
|
10
|
+
const encrypt_js_1 = require("./encrypt.js");
|
|
11
|
+
const hmac_js_1 = require("./hmac.js");
|
|
12
|
+
/**
|
|
13
|
+
* High-level cryptography manager
|
|
14
|
+
* Wraps encryption, decryption, HMAC, and random utilities
|
|
15
|
+
*/
|
|
16
|
+
class CryptoManager {
|
|
17
|
+
constructor(secret) {
|
|
18
|
+
if (!secret || typeof secret !== 'string' || secret.length < 16) {
|
|
19
|
+
throw new errors_1.BadRequestError({
|
|
20
|
+
reason: 'CryptoManager secret must be a non-empty string (min 16 chars)',
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
this.secret = secret;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Encrypt data using AES-256-GCM
|
|
27
|
+
*/
|
|
28
|
+
encrypt(data) {
|
|
29
|
+
if (!data || typeof data !== 'string') {
|
|
30
|
+
throw new errors_1.BadRequestError({
|
|
31
|
+
reason: 'Data to encrypt must be a non-empty string',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return (0, encrypt_js_1.encrypt)(data, this.secret);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Decrypt AES-256-GCM encrypted data
|
|
38
|
+
*/
|
|
39
|
+
decrypt(encrypted) {
|
|
40
|
+
if (!encrypted || typeof encrypted !== 'string') {
|
|
41
|
+
throw new errors_1.BadRequestError({
|
|
42
|
+
reason: 'Encrypted value must be a non-empty string',
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return (0, decrypt_js_1.decrypt)(encrypted, this.secret);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create HMAC SHA-256 signature
|
|
49
|
+
*/
|
|
50
|
+
createHMAC(message) {
|
|
51
|
+
if (!message || typeof message !== 'string') {
|
|
52
|
+
throw new errors_1.BadRequestError({
|
|
53
|
+
reason: 'Message must be a non-empty string',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return (0, hmac_js_1.hmacSign)(message, this.secret);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Verify HMAC SHA-256 signature
|
|
60
|
+
*/
|
|
61
|
+
verifyHMAC(message, signature) {
|
|
62
|
+
if (!message ||
|
|
63
|
+
typeof message !== 'string' ||
|
|
64
|
+
!signature ||
|
|
65
|
+
typeof signature !== 'string') {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return (0, hmac_js_1.hmacVerify)(message, this.secret, signature);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Generate cryptographically secure random bytes
|
|
72
|
+
*/
|
|
73
|
+
generateRandomBytes(length = 32) {
|
|
74
|
+
if (!Number.isInteger(length) || length <= 0) {
|
|
75
|
+
throw new errors_1.BadRequestError({
|
|
76
|
+
reason: 'Random byte length must be a positive integer',
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return crypto_1.default.randomBytes(length);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Generate secure random hex string
|
|
83
|
+
*/
|
|
84
|
+
generateRandomHex(length = 32) {
|
|
85
|
+
if (!Number.isInteger(length) || length <= 0) {
|
|
86
|
+
throw new errors_1.BadRequestError({
|
|
87
|
+
reason: 'Random hex length must be a positive integer',
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return crypto_1.default.randomBytes(length).toString('hex');
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Generate secure random string (URL-safe base64)
|
|
94
|
+
*/
|
|
95
|
+
generateRandomString(length = 32) {
|
|
96
|
+
if (!Number.isInteger(length) || length <= 0) {
|
|
97
|
+
throw new errors_1.BadRequestError({
|
|
98
|
+
reason: 'Random string length must be a positive integer',
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return crypto_1.default
|
|
102
|
+
.randomBytes(Math.ceil((length * 3) / 4))
|
|
103
|
+
.toString('base64url')
|
|
104
|
+
.slice(0, length);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.CryptoManager = CryptoManager;
|
|
@@ -1,28 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.generateStrongPassword = exports.randomToken = exports.hmacVerify = exports.hmacSign = exports.encrypt = exports.
|
|
18
|
-
var
|
|
19
|
-
Object.defineProperty(exports, "
|
|
20
|
-
var
|
|
21
|
-
Object.defineProperty(exports, "encrypt", { enumerable: true, get: function () { return
|
|
22
|
-
var
|
|
23
|
-
Object.defineProperty(exports, "
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
Object.defineProperty(exports, "
|
|
27
|
-
|
|
28
|
-
|
|
3
|
+
exports.generateStrongPassword = exports.randomToken = exports.hmacVerify = exports.hmacSign = exports.decrypt = exports.encrypt = exports.CryptoManager = void 0;
|
|
4
|
+
var CryptoManger_js_1 = require("./CryptoManger.js");
|
|
5
|
+
Object.defineProperty(exports, "CryptoManager", { enumerable: true, get: function () { return CryptoManger_js_1.CryptoManager; } });
|
|
6
|
+
var encrypt_js_1 = require("./encrypt.js");
|
|
7
|
+
Object.defineProperty(exports, "encrypt", { enumerable: true, get: function () { return encrypt_js_1.encrypt; } });
|
|
8
|
+
var decrypt_js_1 = require("./decrypt.js");
|
|
9
|
+
Object.defineProperty(exports, "decrypt", { enumerable: true, get: function () { return decrypt_js_1.decrypt; } });
|
|
10
|
+
var hmac_js_1 = require("./hmac.js");
|
|
11
|
+
Object.defineProperty(exports, "hmacSign", { enumerable: true, get: function () { return hmac_js_1.hmacSign; } });
|
|
12
|
+
Object.defineProperty(exports, "hmacVerify", { enumerable: true, get: function () { return hmac_js_1.hmacVerify; } });
|
|
13
|
+
var random_js_1 = require("./random.js");
|
|
14
|
+
Object.defineProperty(exports, "randomToken", { enumerable: true, get: function () { return random_js_1.randomToken; } });
|
|
15
|
+
Object.defineProperty(exports, "generateStrongPassword", { enumerable: true, get: function () { return random_js_1.generateStrongPassword; } });
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizePassword = exports.estimatePasswordEntropy = exports.safeCompare = exports.ensureValidPassword = exports.PasswordManager = exports.verifyPasswordWithPepperSync = exports.verifyPasswordSync = exports.verifyPasswordWithPepper = exports.verifyPassword = exports.isPasswordStrong = exports.hashPasswordWithPepperSync = exports.hashPasswordSync = exports.hashPasswordWithPepper = exports.hashPassword = exports.JWTManager = exports.safeVerifyTokenWithOptions = exports.safeVerifyToken = exports.verifyTokenWithOptions = exports.verifyToken = exports.isTokenExpired = exports.validateTokenPayload = exports.signToken = exports.parseDuration = exports.rotateRefreshToken = exports.generateTokens = exports.extractToken = exports.decodeTokenStrict = exports.decodeToken = exports.generateStrongPassword = exports.randomToken = exports.hmacVerify = exports.hmacSign = exports.decrypt = exports.encrypt = exports.CryptoManager = void 0;
|
|
4
|
+
// Re-export everything from crypto module
|
|
5
|
+
var index_js_1 = require("./crypto/index.js");
|
|
6
|
+
Object.defineProperty(exports, "CryptoManager", { enumerable: true, get: function () { return index_js_1.CryptoManager; } });
|
|
7
|
+
Object.defineProperty(exports, "encrypt", { enumerable: true, get: function () { return index_js_1.encrypt; } });
|
|
8
|
+
Object.defineProperty(exports, "decrypt", { enumerable: true, get: function () { return index_js_1.decrypt; } });
|
|
9
|
+
Object.defineProperty(exports, "hmacSign", { enumerable: true, get: function () { return index_js_1.hmacSign; } });
|
|
10
|
+
Object.defineProperty(exports, "hmacVerify", { enumerable: true, get: function () { return index_js_1.hmacVerify; } });
|
|
11
|
+
Object.defineProperty(exports, "randomToken", { enumerable: true, get: function () { return index_js_1.randomToken; } });
|
|
12
|
+
Object.defineProperty(exports, "generateStrongPassword", { enumerable: true, get: function () { return index_js_1.generateStrongPassword; } });
|
|
13
|
+
// Re-export everything from jwt module
|
|
14
|
+
var index_js_2 = require("./jwt/index.js");
|
|
15
|
+
Object.defineProperty(exports, "decodeToken", { enumerable: true, get: function () { return index_js_2.decodeToken; } });
|
|
16
|
+
Object.defineProperty(exports, "decodeTokenStrict", { enumerable: true, get: function () { return index_js_2.decodeTokenStrict; } });
|
|
17
|
+
Object.defineProperty(exports, "extractToken", { enumerable: true, get: function () { return index_js_2.extractToken; } });
|
|
18
|
+
Object.defineProperty(exports, "generateTokens", { enumerable: true, get: function () { return index_js_2.generateTokens; } });
|
|
19
|
+
Object.defineProperty(exports, "rotateRefreshToken", { enumerable: true, get: function () { return index_js_2.rotateRefreshToken; } });
|
|
20
|
+
Object.defineProperty(exports, "parseDuration", { enumerable: true, get: function () { return index_js_2.parseDuration; } });
|
|
21
|
+
Object.defineProperty(exports, "signToken", { enumerable: true, get: function () { return index_js_2.signToken; } });
|
|
22
|
+
Object.defineProperty(exports, "validateTokenPayload", { enumerable: true, get: function () { return index_js_2.validateTokenPayload; } });
|
|
23
|
+
Object.defineProperty(exports, "isTokenExpired", { enumerable: true, get: function () { return index_js_2.isTokenExpired; } });
|
|
24
|
+
Object.defineProperty(exports, "verifyToken", { enumerable: true, get: function () { return index_js_2.verifyToken; } });
|
|
25
|
+
Object.defineProperty(exports, "verifyTokenWithOptions", { enumerable: true, get: function () { return index_js_2.verifyTokenWithOptions; } });
|
|
26
|
+
Object.defineProperty(exports, "safeVerifyToken", { enumerable: true, get: function () { return index_js_2.safeVerifyToken; } });
|
|
27
|
+
Object.defineProperty(exports, "safeVerifyTokenWithOptions", { enumerable: true, get: function () { return index_js_2.safeVerifyTokenWithOptions; } });
|
|
28
|
+
Object.defineProperty(exports, "JWTManager", { enumerable: true, get: function () { return index_js_2.JWTManager; } });
|
|
29
|
+
// Re-export everything from password module
|
|
30
|
+
var index_js_3 = require("./password/index.js");
|
|
31
|
+
Object.defineProperty(exports, "hashPassword", { enumerable: true, get: function () { return index_js_3.hashPassword; } });
|
|
32
|
+
Object.defineProperty(exports, "hashPasswordWithPepper", { enumerable: true, get: function () { return index_js_3.hashPasswordWithPepper; } });
|
|
33
|
+
Object.defineProperty(exports, "hashPasswordSync", { enumerable: true, get: function () { return index_js_3.hashPasswordSync; } });
|
|
34
|
+
Object.defineProperty(exports, "hashPasswordWithPepperSync", { enumerable: true, get: function () { return index_js_3.hashPasswordWithPepperSync; } });
|
|
35
|
+
Object.defineProperty(exports, "isPasswordStrong", { enumerable: true, get: function () { return index_js_3.isPasswordStrong; } });
|
|
36
|
+
Object.defineProperty(exports, "verifyPassword", { enumerable: true, get: function () { return index_js_3.verifyPassword; } });
|
|
37
|
+
Object.defineProperty(exports, "verifyPasswordWithPepper", { enumerable: true, get: function () { return index_js_3.verifyPasswordWithPepper; } });
|
|
38
|
+
Object.defineProperty(exports, "verifyPasswordSync", { enumerable: true, get: function () { return index_js_3.verifyPasswordSync; } });
|
|
39
|
+
Object.defineProperty(exports, "verifyPasswordWithPepperSync", { enumerable: true, get: function () { return index_js_3.verifyPasswordWithPepperSync; } });
|
|
40
|
+
Object.defineProperty(exports, "PasswordManager", { enumerable: true, get: function () { return index_js_3.PasswordManager; } });
|
|
41
|
+
Object.defineProperty(exports, "ensureValidPassword", { enumerable: true, get: function () { return index_js_3.ensureValidPassword; } });
|
|
42
|
+
Object.defineProperty(exports, "safeCompare", { enumerable: true, get: function () { return index_js_3.safeCompare; } });
|
|
43
|
+
Object.defineProperty(exports, "estimatePasswordEntropy", { enumerable: true, get: function () { return index_js_3.estimatePasswordEntropy; } });
|
|
44
|
+
Object.defineProperty(exports, "normalizePassword", { enumerable: true, get: function () { return index_js_3.normalizePassword; } });
|
|
@@ -4,11 +4,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.JWTManager = void 0;
|
|
7
|
+
const errors_1 = require("@naman_deep_singh/errors");
|
|
8
|
+
const utils_1 = require("@naman_deep_singh/utils");
|
|
7
9
|
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const errors_utils_1 = require("@naman_deep_singh/errors-utils");
|
|
11
|
-
const js_extensions_1 = require("@naman_deep_singh/js-extensions");
|
|
10
|
+
const signToken_js_1 = require("./signToken.js");
|
|
11
|
+
const verify_js_1 = require("./verify.js");
|
|
12
12
|
class JWTManager {
|
|
13
13
|
constructor(config) {
|
|
14
14
|
this.accessSecret = config.accessSecret;
|
|
@@ -17,7 +17,7 @@ class JWTManager {
|
|
|
17
17
|
this.refreshExpiry = config.refreshExpiry || '7d';
|
|
18
18
|
this.cacheTTL = 5 * 60 * 1000; // 5 minutes
|
|
19
19
|
if (config.enableCaching) {
|
|
20
|
-
this.cache = new
|
|
20
|
+
this.cache = new utils_1.LRUCache(config.maxCacheSize || 100);
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
/** Generate both access and refresh tokens */
|
|
@@ -29,39 +29,39 @@ class JWTManager {
|
|
|
29
29
|
return { accessToken, refreshToken };
|
|
30
30
|
}
|
|
31
31
|
catch (error) {
|
|
32
|
-
if (error instanceof
|
|
32
|
+
if (error instanceof errors_1.BadRequestError || error instanceof errors_1.ValidationError)
|
|
33
33
|
throw error;
|
|
34
|
-
throw new
|
|
34
|
+
throw new errors_1.BadRequestError({ reason: 'Failed to generate tokens' }, error instanceof Error ? error : undefined);
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
/** Generate access token */
|
|
38
38
|
async generateAccessToken(payload) {
|
|
39
39
|
try {
|
|
40
40
|
this.validatePayload(payload);
|
|
41
|
-
const token = (0,
|
|
41
|
+
const token = (0, signToken_js_1.signToken)(payload, this.accessSecret, this.accessExpiry, {
|
|
42
42
|
algorithm: 'HS256',
|
|
43
43
|
});
|
|
44
44
|
return token;
|
|
45
45
|
}
|
|
46
46
|
catch (error) {
|
|
47
|
-
if (error instanceof
|
|
47
|
+
if (error instanceof errors_1.BadRequestError || error instanceof errors_1.ValidationError)
|
|
48
48
|
throw error;
|
|
49
|
-
throw new
|
|
49
|
+
throw new errors_1.BadRequestError({ reason: 'Failed to generate access token' }, error instanceof Error ? error : undefined);
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
/** Generate refresh token */
|
|
53
53
|
async generateRefreshToken(payload) {
|
|
54
54
|
try {
|
|
55
55
|
this.validatePayload(payload);
|
|
56
|
-
const token = (0,
|
|
56
|
+
const token = (0, signToken_js_1.signToken)(payload, this.refreshSecret, this.refreshExpiry, {
|
|
57
57
|
algorithm: 'HS256',
|
|
58
58
|
});
|
|
59
59
|
return token;
|
|
60
60
|
}
|
|
61
61
|
catch (error) {
|
|
62
|
-
if (error instanceof
|
|
62
|
+
if (error instanceof errors_1.BadRequestError || error instanceof errors_1.ValidationError)
|
|
63
63
|
throw error;
|
|
64
|
-
throw new
|
|
64
|
+
throw new errors_1.BadRequestError({ reason: 'Failed to generate refresh token' }, error instanceof Error ? error : undefined);
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
/** Verify access token */
|
|
@@ -91,12 +91,12 @@ class JWTManager {
|
|
|
91
91
|
validateToken(token, secret) {
|
|
92
92
|
if (!token || typeof token !== 'string')
|
|
93
93
|
return false;
|
|
94
|
-
return (0,
|
|
94
|
+
return (0, verify_js_1.safeVerifyToken)(token, secret).valid;
|
|
95
95
|
}
|
|
96
96
|
/** Rotate refresh token */
|
|
97
97
|
async rotateRefreshToken(oldToken) {
|
|
98
98
|
if (!oldToken || typeof oldToken !== 'string') {
|
|
99
|
-
throw new
|
|
99
|
+
throw new errors_1.ValidationError({
|
|
100
100
|
reason: 'Old refresh token must be a non-empty string',
|
|
101
101
|
});
|
|
102
102
|
}
|
|
@@ -104,7 +104,7 @@ class JWTManager {
|
|
|
104
104
|
const payload = { ...decoded };
|
|
105
105
|
delete payload.iat;
|
|
106
106
|
delete payload.exp;
|
|
107
|
-
const newToken = (0,
|
|
107
|
+
const newToken = (0, signToken_js_1.signToken)(payload, this.refreshSecret, this.refreshExpiry);
|
|
108
108
|
return newToken;
|
|
109
109
|
}
|
|
110
110
|
/** Check if token is expired */
|
|
@@ -144,17 +144,17 @@ class JWTManager {
|
|
|
144
144
|
/** Private helper methods */
|
|
145
145
|
validatePayload(payload) {
|
|
146
146
|
if (!payload || typeof payload !== 'object') {
|
|
147
|
-
throw new
|
|
147
|
+
throw new errors_1.ValidationError({
|
|
148
148
|
reason: 'Payload must be a non-null object',
|
|
149
149
|
});
|
|
150
150
|
}
|
|
151
151
|
if (Object.keys(payload).length === 0) {
|
|
152
|
-
throw new
|
|
152
|
+
throw new errors_1.ValidationError({ reason: 'Payload cannot be empty' });
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
155
|
async verifyTokenWithCache(token, secret, type) {
|
|
156
156
|
if (!token || typeof token !== 'string') {
|
|
157
|
-
throw new
|
|
157
|
+
throw new errors_1.ValidationError({
|
|
158
158
|
reason: `${type} token must be a non-empty string`,
|
|
159
159
|
});
|
|
160
160
|
}
|
|
@@ -163,20 +163,20 @@ class JWTManager {
|
|
|
163
163
|
const cached = this.cache.get(cacheKey);
|
|
164
164
|
if (cached && Date.now() - cached.timestamp <= this.cacheTTL) {
|
|
165
165
|
if (!cached.valid)
|
|
166
|
-
throw new
|
|
166
|
+
throw new errors_1.UnauthorizedError({
|
|
167
167
|
reason: `${type} token is invalid or expired`,
|
|
168
168
|
});
|
|
169
169
|
return cached.payload;
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
|
-
const { valid, payload, error } = (0,
|
|
172
|
+
const { valid, payload, error } = (0, verify_js_1.safeVerifyToken)(token, secret);
|
|
173
173
|
if (!valid || !payload || typeof payload === 'string') {
|
|
174
174
|
this.cache?.set(cacheKey, {
|
|
175
175
|
valid: false,
|
|
176
176
|
payload: {},
|
|
177
177
|
timestamp: Date.now(),
|
|
178
178
|
});
|
|
179
|
-
throw new
|
|
179
|
+
throw new errors_1.UnauthorizedError({
|
|
180
180
|
reason: `${type} token is invalid or expired`,
|
|
181
181
|
cause: error,
|
|
182
182
|
});
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.decodeToken = decodeToken;
|
|
4
4
|
exports.decodeTokenStrict = decodeTokenStrict;
|
|
5
|
-
const
|
|
6
|
-
// src/jwt/decodeToken.ts
|
|
5
|
+
const errors_1 = require("@naman_deep_singh/errors");
|
|
7
6
|
const jsonwebtoken_1 = require("jsonwebtoken");
|
|
8
7
|
/**
|
|
9
8
|
* Flexible decode
|
|
@@ -20,7 +19,7 @@ function decodeToken(token) {
|
|
|
20
19
|
function decodeTokenStrict(token) {
|
|
21
20
|
const decoded = (0, jsonwebtoken_1.decode)(token);
|
|
22
21
|
if (!decoded || typeof decoded === 'string') {
|
|
23
|
-
throw new
|
|
22
|
+
throw new errors_1.BadRequestError({
|
|
24
23
|
reason: 'Invalid JWT payload structure',
|
|
25
24
|
});
|
|
26
25
|
}
|
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateTokens = void 0;
|
|
4
4
|
exports.rotateRefreshToken = rotateRefreshToken;
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
5
|
+
const errors_1 = require("@naman_deep_singh/errors");
|
|
6
|
+
const signToken_js_1 = require("./signToken.js");
|
|
7
|
+
const verify_js_1 = require("./verify.js");
|
|
8
8
|
// Helper function to create branded tokens
|
|
9
9
|
/* const createBrandedToken = <T extends string>(token: string, _brand: T): T => {
|
|
10
10
|
return token as T
|
|
11
11
|
} */
|
|
12
12
|
const generateTokens = (payload, accessSecret, refreshSecret, accessExpiry = '15m', refreshExpiry = '7d') => {
|
|
13
|
-
const accessToken = (0,
|
|
13
|
+
const accessToken = (0, signToken_js_1.signToken)(payload, accessSecret, accessExpiry, {
|
|
14
14
|
algorithm: 'HS256',
|
|
15
15
|
});
|
|
16
|
-
const refreshToken = (0,
|
|
16
|
+
const refreshToken = (0, signToken_js_1.signToken)(payload, refreshSecret, refreshExpiry, {
|
|
17
17
|
algorithm: 'HS256',
|
|
18
18
|
});
|
|
19
19
|
return {
|
|
@@ -23,15 +23,15 @@ const generateTokens = (payload, accessSecret, refreshSecret, accessExpiry = '15
|
|
|
23
23
|
};
|
|
24
24
|
exports.generateTokens = generateTokens;
|
|
25
25
|
function rotateRefreshToken(oldToken, secret) {
|
|
26
|
-
const decoded = (0,
|
|
26
|
+
const decoded = (0, verify_js_1.verifyToken)(oldToken, secret);
|
|
27
27
|
if (typeof decoded === 'string') {
|
|
28
|
-
throw new
|
|
28
|
+
throw new errors_1.TokenMalformedError({
|
|
29
29
|
reason: 'Invalid token payload — expected JWT payload object',
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
32
|
const payload = { ...decoded };
|
|
33
33
|
delete payload.iat;
|
|
34
34
|
delete payload.exp;
|
|
35
|
-
const newToken = (0,
|
|
35
|
+
const newToken = (0, signToken_js_1.signToken)(payload, secret, '7d');
|
|
36
36
|
return newToken;
|
|
37
37
|
}
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
3
|
+
exports.JWTManager = exports.safeVerifyTokenWithOptions = exports.safeVerifyToken = exports.verifyTokenWithOptions = exports.verifyToken = exports.isTokenExpired = exports.validateTokenPayload = exports.signToken = exports.parseDuration = exports.rotateRefreshToken = exports.generateTokens = exports.extractToken = exports.decodeTokenStrict = exports.decodeToken = void 0;
|
|
4
|
+
var decode_js_1 = require("./decode.js");
|
|
5
|
+
Object.defineProperty(exports, "decodeToken", { enumerable: true, get: function () { return decode_js_1.decodeToken; } });
|
|
6
|
+
Object.defineProperty(exports, "decodeTokenStrict", { enumerable: true, get: function () { return decode_js_1.decodeTokenStrict; } });
|
|
7
|
+
var extractToken_js_1 = require("./extractToken.js");
|
|
8
|
+
Object.defineProperty(exports, "extractToken", { enumerable: true, get: function () { return extractToken_js_1.extractToken; } });
|
|
9
|
+
var generateTokens_js_1 = require("./generateTokens.js");
|
|
10
|
+
Object.defineProperty(exports, "generateTokens", { enumerable: true, get: function () { return generateTokens_js_1.generateTokens; } });
|
|
11
|
+
Object.defineProperty(exports, "rotateRefreshToken", { enumerable: true, get: function () { return generateTokens_js_1.rotateRefreshToken; } });
|
|
12
|
+
var parseDuration_js_1 = require("./parseDuration.js");
|
|
13
|
+
Object.defineProperty(exports, "parseDuration", { enumerable: true, get: function () { return parseDuration_js_1.parseDuration; } });
|
|
14
|
+
var signToken_js_1 = require("./signToken.js");
|
|
15
|
+
Object.defineProperty(exports, "signToken", { enumerable: true, get: function () { return signToken_js_1.signToken; } });
|
|
16
|
+
var validateToken_js_1 = require("./validateToken.js");
|
|
17
|
+
Object.defineProperty(exports, "validateTokenPayload", { enumerable: true, get: function () { return validateToken_js_1.validateTokenPayload; } });
|
|
18
|
+
Object.defineProperty(exports, "isTokenExpired", { enumerable: true, get: function () { return validateToken_js_1.isTokenExpired; } });
|
|
19
|
+
var verify_js_1 = require("./verify.js");
|
|
20
|
+
Object.defineProperty(exports, "verifyToken", { enumerable: true, get: function () { return verify_js_1.verifyToken; } });
|
|
21
|
+
Object.defineProperty(exports, "verifyTokenWithOptions", { enumerable: true, get: function () { return verify_js_1.verifyTokenWithOptions; } });
|
|
22
|
+
Object.defineProperty(exports, "safeVerifyToken", { enumerable: true, get: function () { return verify_js_1.safeVerifyToken; } });
|
|
23
|
+
Object.defineProperty(exports, "safeVerifyTokenWithOptions", { enumerable: true, get: function () { return verify_js_1.safeVerifyTokenWithOptions; } });
|
|
24
|
+
var JWTManager_js_1 = require("./JWTManager.js");
|
|
25
|
+
Object.defineProperty(exports, "JWTManager", { enumerable: true, get: function () { return JWTManager_js_1.JWTManager; } });
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseDuration = parseDuration;
|
|
4
|
-
const
|
|
4
|
+
const errors_1 = require("@naman_deep_singh/errors");
|
|
5
5
|
const TIME_UNITS = {
|
|
6
6
|
s: 1,
|
|
7
7
|
m: 60,
|
|
@@ -19,12 +19,12 @@ function parseDuration(input) {
|
|
|
19
19
|
const value = Number.parseInt(match[1], 10);
|
|
20
20
|
const unit = match[2].toLowerCase();
|
|
21
21
|
if (!TIME_UNITS[unit]) {
|
|
22
|
-
throw new
|
|
22
|
+
throw new errors_1.ValidationError({ reason: `Invalid time unit: ${unit}` });
|
|
23
23
|
}
|
|
24
24
|
totalSeconds += value * TIME_UNITS[unit];
|
|
25
25
|
}
|
|
26
26
|
if (totalSeconds === 0) {
|
|
27
|
-
throw new
|
|
27
|
+
throw new errors_1.ValidationError({ reason: `Invalid expiry format: "${input}"` });
|
|
28
28
|
}
|
|
29
29
|
return totalSeconds;
|
|
30
30
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.signToken = void 0;
|
|
4
|
-
const
|
|
4
|
+
const errors_1 = require("@naman_deep_singh/errors");
|
|
5
5
|
const jsonwebtoken_1 = require("jsonwebtoken");
|
|
6
|
-
const
|
|
6
|
+
const parseDuration_js_1 = require("./parseDuration.js");
|
|
7
7
|
function getExpiryTimestamp(seconds) {
|
|
8
8
|
return Math.floor(Date.now() / 1000) + seconds;
|
|
9
9
|
}
|
|
10
10
|
const signToken = (payload, secret, expiresIn = '1h', options = {}) => {
|
|
11
|
-
const seconds = (0,
|
|
11
|
+
const seconds = (0, parseDuration_js_1.parseDuration)(expiresIn);
|
|
12
12
|
if (!seconds || seconds < 10) {
|
|
13
|
-
throw new
|
|
13
|
+
throw new errors_1.ValidationError({ reason: 'Token expiry too small' });
|
|
14
14
|
}
|
|
15
15
|
const tokenPayload = {
|
|
16
16
|
...payload,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.validateTokenPayload = validateTokenPayload;
|
|
4
4
|
exports.isTokenExpired = isTokenExpired;
|
|
5
|
-
const
|
|
5
|
+
const errors_1 = require("@naman_deep_singh/errors");
|
|
6
6
|
/**
|
|
7
7
|
* Validates a JWT payload according to the provided rules.
|
|
8
8
|
* Throws ValidationError if validation fails.
|
|
@@ -12,7 +12,7 @@ function validateTokenPayload(payload, rules = { requiredFields: ['exp', 'iat']
|
|
|
12
12
|
// 1. Required fields
|
|
13
13
|
for (const field of requiredFields) {
|
|
14
14
|
if (!(field in payload)) {
|
|
15
|
-
throw new
|
|
15
|
+
throw new errors_1.ValidationError({
|
|
16
16
|
reason: `Missing required field: ${field}`,
|
|
17
17
|
});
|
|
18
18
|
}
|
|
@@ -20,7 +20,7 @@ function validateTokenPayload(payload, rules = { requiredFields: ['exp', 'iat']
|
|
|
20
20
|
// 2. Forbidden fields
|
|
21
21
|
for (const field of forbiddenFields) {
|
|
22
22
|
if (field in payload) {
|
|
23
|
-
throw new
|
|
23
|
+
throw new errors_1.ValidationError({
|
|
24
24
|
reason: `Forbidden field in token: ${field}`,
|
|
25
25
|
});
|
|
26
26
|
}
|
|
@@ -29,7 +29,7 @@ function validateTokenPayload(payload, rules = { requiredFields: ['exp', 'iat']
|
|
|
29
29
|
for (const key in validateTypes) {
|
|
30
30
|
const expectedType = validateTypes[key];
|
|
31
31
|
if (key in payload && typeof payload[key] !== expectedType) {
|
|
32
|
-
throw new
|
|
32
|
+
throw new errors_1.ValidationError({
|
|
33
33
|
reason: `Invalid type for ${key}. Expected ${expectedType}, got ${typeof payload[key]}`,
|
|
34
34
|
});
|
|
35
35
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.safeVerifyTokenWithOptions = exports.safeVerifyToken = exports.verifyTokenWithOptions = exports.verifyToken = void 0;
|
|
4
|
-
const
|
|
4
|
+
const errors_1 = require("@naman_deep_singh/errors");
|
|
5
5
|
const jsonwebtoken_1 = require("jsonwebtoken");
|
|
6
6
|
/**
|
|
7
7
|
* Verify token (throws UnauthorizedError if invalid or expired)
|
|
@@ -12,12 +12,12 @@ const verifyToken = (token, secret) => {
|
|
|
12
12
|
}
|
|
13
13
|
catch (error) {
|
|
14
14
|
if (error.name === 'TokenExpiredError') {
|
|
15
|
-
throw new
|
|
15
|
+
throw new errors_1.UnauthorizedError({ reason: 'Token has expired' }, error);
|
|
16
16
|
}
|
|
17
17
|
if (error.name === 'JsonWebTokenError') {
|
|
18
|
-
throw new
|
|
18
|
+
throw new errors_1.UnauthorizedError({ reason: 'Invalid token' }, error);
|
|
19
19
|
}
|
|
20
|
-
throw new
|
|
20
|
+
throw new errors_1.UnauthorizedError({ reason: 'Failed to verify token' }, error);
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
23
|
exports.verifyToken = verifyToken;
|
|
@@ -30,12 +30,12 @@ const verifyTokenWithOptions = (token, secret, options = {}) => {
|
|
|
30
30
|
}
|
|
31
31
|
catch (error) {
|
|
32
32
|
if (error.name === 'TokenExpiredError') {
|
|
33
|
-
throw new
|
|
33
|
+
throw new errors_1.UnauthorizedError({ reason: 'Token has expired' }, error);
|
|
34
34
|
}
|
|
35
35
|
if (error.name === 'JsonWebTokenError') {
|
|
36
|
-
throw new
|
|
36
|
+
throw new errors_1.UnauthorizedError({ reason: 'Invalid token' }, error);
|
|
37
37
|
}
|
|
38
|
-
throw new
|
|
38
|
+
throw new errors_1.UnauthorizedError({ reason: 'Failed to verify token' }, error);
|
|
39
39
|
}
|
|
40
40
|
};
|
|
41
41
|
exports.verifyTokenWithOptions = verifyTokenWithOptions;
|
|
@@ -50,13 +50,13 @@ const safeVerifyToken = (token, secret) => {
|
|
|
50
50
|
catch (error) {
|
|
51
51
|
let wrappedError;
|
|
52
52
|
if (error.name === 'TokenExpiredError') {
|
|
53
|
-
wrappedError = new
|
|
53
|
+
wrappedError = new errors_1.UnauthorizedError({ reason: 'Token has expired' }, error);
|
|
54
54
|
}
|
|
55
55
|
else if (error.name === 'JsonWebTokenError') {
|
|
56
|
-
wrappedError = new
|
|
56
|
+
wrappedError = new errors_1.UnauthorizedError({ reason: 'Invalid token' }, error);
|
|
57
57
|
}
|
|
58
58
|
else {
|
|
59
|
-
wrappedError = new
|
|
59
|
+
wrappedError = new errors_1.UnauthorizedError({ reason: 'Failed to verify token' }, error);
|
|
60
60
|
}
|
|
61
61
|
return { valid: false, error: wrappedError };
|
|
62
62
|
}
|
|
@@ -73,15 +73,15 @@ const safeVerifyTokenWithOptions = (token, secret, options = {}) => {
|
|
|
73
73
|
catch (error) {
|
|
74
74
|
let wrappedError;
|
|
75
75
|
if (error.name === 'TokenExpiredError') {
|
|
76
|
-
wrappedError = new
|
|
76
|
+
wrappedError = new errors_1.UnauthorizedError({ reason: 'Token has expired' }, error instanceof Error ? error : undefined);
|
|
77
77
|
}
|
|
78
78
|
else if (error.name === 'JsonWebTokenError') {
|
|
79
|
-
wrappedError = new
|
|
79
|
+
wrappedError = new errors_1.UnauthorizedError({
|
|
80
80
|
reason: 'Invalid token',
|
|
81
81
|
}, error instanceof Error ? error : undefined);
|
|
82
82
|
}
|
|
83
83
|
else {
|
|
84
|
-
wrappedError = new
|
|
84
|
+
wrappedError = new errors_1.UnauthorizedError({ reason: 'Failed to verify token' }, error instanceof Error ? error : undefined);
|
|
85
85
|
}
|
|
86
86
|
return { valid: false, error: wrappedError };
|
|
87
87
|
}
|