@veloxts/auth 0.3.4 → 0.3.6
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 +425 -22
- package/dist/__integration__/fixtures.d.ts +41 -0
- package/dist/__integration__/fixtures.d.ts.map +1 -0
- package/dist/__integration__/fixtures.js +79 -0
- package/dist/__integration__/fixtures.js.map +1 -0
- package/dist/__integration__/setup.d.ts +26 -0
- package/dist/__integration__/setup.d.ts.map +1 -0
- package/dist/__integration__/setup.js +28 -0
- package/dist/__integration__/setup.js.map +1 -0
- package/dist/csrf.d.ts +9 -3
- package/dist/csrf.d.ts.map +1 -1
- package/dist/csrf.js +9 -3
- package/dist/csrf.js.map +1 -1
- package/dist/guards.d.ts +12 -9
- package/dist/guards.d.ts.map +1 -1
- package/dist/guards.js +17 -5
- package/dist/guards.js.map +1 -1
- package/dist/hash.d.ts +7 -1
- package/dist/hash.d.ts.map +1 -1
- package/dist/hash.js +20 -4
- package/dist/hash.js.map +1 -1
- package/dist/index.d.ts +10 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -7
- package/dist/index.js.map +1 -1
- package/dist/jwt.d.ts +34 -5
- package/dist/jwt.d.ts.map +1 -1
- package/dist/jwt.js +154 -28
- package/dist/jwt.js.map +1 -1
- package/dist/middleware.d.ts +18 -6
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +23 -11
- package/dist/middleware.js.map +1 -1
- package/dist/password-policy.d.ts +259 -0
- package/dist/password-policy.d.ts.map +1 -0
- package/dist/password-policy.js +529 -0
- package/dist/password-policy.js.map +1 -0
- package/dist/plugin.d.ts +25 -7
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +28 -9
- package/dist/plugin.js.map +1 -1
- package/dist/rate-limit.d.ts +231 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +352 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/session.d.ts +9 -3
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +9 -3
- package/dist/session.js.map +1 -1
- package/dist/types.d.ts +11 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +30 -7
package/dist/jwt.d.ts
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
* @module auth/jwt
|
|
4
4
|
*/
|
|
5
5
|
import type { JwtConfig, TokenPair, TokenPayload, User } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Validates a time string format
|
|
8
|
+
* Supports: '1s', '15m', '1h', '7d', etc.
|
|
9
|
+
* Minimum valid value is '1s' (1 second)
|
|
10
|
+
*
|
|
11
|
+
* @returns true if valid, false otherwise
|
|
12
|
+
*/
|
|
13
|
+
export declare function isValidTimespan(time: string): boolean;
|
|
6
14
|
/**
|
|
7
15
|
* Parses time string to seconds
|
|
8
16
|
* Supports: '15m', '1h', '7d', '30d', etc.
|
|
@@ -12,6 +20,14 @@ export declare function parseTimeToSeconds(time: string): number;
|
|
|
12
20
|
* Generate a unique token ID
|
|
13
21
|
*/
|
|
14
22
|
export declare function generateTokenId(): string;
|
|
23
|
+
/**
|
|
24
|
+
* Validates token expiration against security bounds
|
|
25
|
+
*
|
|
26
|
+
* @param accessExpiry - Access token expiry string (e.g., '15m')
|
|
27
|
+
* @param refreshExpiry - Refresh token expiry string (e.g., '7d')
|
|
28
|
+
* @throws Error if expiration times are outside security bounds
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateTokenExpiration(accessExpiry: string, refreshExpiry: string): void;
|
|
15
31
|
/**
|
|
16
32
|
* JWT token manager
|
|
17
33
|
*
|
|
@@ -41,16 +57,23 @@ export declare class JwtManager {
|
|
|
41
57
|
constructor(config: JwtConfig);
|
|
42
58
|
/**
|
|
43
59
|
* Creates a JWT token with the given payload
|
|
60
|
+
*
|
|
61
|
+
* @param payload - Token payload (sub, email, type required)
|
|
62
|
+
* @param expiresIn - Expiration time string (e.g., '15m', '7d')
|
|
63
|
+
* @param options - Additional options
|
|
64
|
+
* @param options.notBefore - Delay in seconds before token becomes valid (default: 0)
|
|
44
65
|
*/
|
|
45
66
|
createToken(payload: Omit<TokenPayload, 'iat' | 'exp'> & {
|
|
46
67
|
sub: string;
|
|
47
68
|
email: string;
|
|
48
69
|
type: TokenPayload['type'];
|
|
49
|
-
}, expiresIn: string
|
|
70
|
+
}, expiresIn: string, options?: {
|
|
71
|
+
notBefore?: number;
|
|
72
|
+
}): string;
|
|
50
73
|
/**
|
|
51
74
|
* Verifies a JWT token and returns the payload
|
|
52
75
|
*
|
|
53
|
-
* @throws
|
|
76
|
+
* @throws AuthError if token is invalid or expired
|
|
54
77
|
*/
|
|
55
78
|
verifyToken(token: string): TokenPayload;
|
|
56
79
|
/**
|
|
@@ -58,13 +81,13 @@ export declare class JwtManager {
|
|
|
58
81
|
*
|
|
59
82
|
* @param user - The user to create tokens for
|
|
60
83
|
* @param additionalClaims - Custom claims to include (cannot override reserved claims)
|
|
61
|
-
* @throws
|
|
84
|
+
* @throws AuthError if additionalClaims contains reserved JWT claims
|
|
62
85
|
*/
|
|
63
86
|
createTokenPair(user: User, additionalClaims?: Record<string, unknown>): TokenPair;
|
|
64
87
|
/**
|
|
65
88
|
* Refreshes tokens using a valid refresh token
|
|
66
89
|
*
|
|
67
|
-
* @throws
|
|
90
|
+
* @throws AuthError if refresh token is invalid or not a refresh token
|
|
68
91
|
*/
|
|
69
92
|
refreshTokens(refreshToken: string, userLoader?: (userId: string) => Promise<User | null>): Promise<TokenPair>;
|
|
70
93
|
refreshTokens(refreshToken: string): TokenPair;
|
|
@@ -79,10 +102,16 @@ export declare class JwtManager {
|
|
|
79
102
|
*/
|
|
80
103
|
extractFromHeader(authHeader: string | undefined): string | null;
|
|
81
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* Creates a new JWT manager instance (succinct API)
|
|
107
|
+
*/
|
|
108
|
+
export declare function jwtManager(config: JwtConfig): JwtManager;
|
|
82
109
|
/**
|
|
83
110
|
* Creates a new JWT manager instance
|
|
111
|
+
*
|
|
112
|
+
* @deprecated Use `jwtManager()` instead. Will be removed in v0.9.
|
|
84
113
|
*/
|
|
85
|
-
export declare
|
|
114
|
+
export declare const createJwtManager: typeof jwtManager;
|
|
86
115
|
/**
|
|
87
116
|
* Token store interface for revocation management
|
|
88
117
|
*/
|
package/dist/jwt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AA+E3E;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQrD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyBvD;AA4BD;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAkEzF;AAMD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGX;gBAEA,MAAM,EAAE,SAAS;IAyD7B;;;;;;;OAOG;IACH,WAAW,CACT,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG;QAC3C,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;KAC5B,EACD,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,MAAM;IA2BT;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IA6FxC;;;;;;OAMG;IACH,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IA4ClF;;;;OAIG;IACH,aAAa,CACX,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,GACpD,OAAO,CAAC,SAAS,CAAC;IACrB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS;IA8B9C;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAa/C;;;OAGG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI;CAYjE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,CAExD;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,mBAAa,CAAC;AAM3C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,kCAAkC;IAClC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,oDAAoD;IACpD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,wBAAwB,IAAI,UAAU,CAYrD"}
|
package/dist/jwt.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* @module auth/jwt
|
|
4
4
|
*/
|
|
5
5
|
import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
6
|
+
import { AuthError } from './types.js';
|
|
6
7
|
// ============================================================================
|
|
7
8
|
// Constants
|
|
8
9
|
// ============================================================================
|
|
@@ -17,6 +18,38 @@ const MIN_SECRET_LENGTH = 64;
|
|
|
17
18
|
* Minimum unique characters in secret for entropy validation
|
|
18
19
|
*/
|
|
19
20
|
const MIN_SECRET_ENTROPY_CHARS = 16;
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// Token Expiration Bounds (Security Phase 3.1)
|
|
23
|
+
// ============================================================================
|
|
24
|
+
/**
|
|
25
|
+
* Minimum access token expiry: 1 minute
|
|
26
|
+
* Shorter tokens increase security but may impact UX
|
|
27
|
+
*/
|
|
28
|
+
const MIN_ACCESS_TOKEN_SECONDS = 60;
|
|
29
|
+
/**
|
|
30
|
+
* Maximum access token expiry: 1 hour
|
|
31
|
+
* Longer lived tokens are a security risk if stolen
|
|
32
|
+
*/
|
|
33
|
+
const MAX_ACCESS_TOKEN_SECONDS = 60 * 60;
|
|
34
|
+
/**
|
|
35
|
+
* Minimum refresh token expiry: 1 hour
|
|
36
|
+
* Too short reduces usability
|
|
37
|
+
*/
|
|
38
|
+
const MIN_REFRESH_TOKEN_SECONDS = 60 * 60;
|
|
39
|
+
/**
|
|
40
|
+
* Maximum refresh token expiry: 30 days
|
|
41
|
+
* Longer lived refresh tokens increase risk window
|
|
42
|
+
*/
|
|
43
|
+
const MAX_REFRESH_TOKEN_SECONDS = 30 * 24 * 60 * 60;
|
|
44
|
+
/**
|
|
45
|
+
* Recommended maximum access token expiry: 15 minutes
|
|
46
|
+
* Beyond this, consider shorter lived tokens with refresh
|
|
47
|
+
*/
|
|
48
|
+
const RECOMMENDED_MAX_ACCESS_SECONDS = 15 * 60;
|
|
49
|
+
/**
|
|
50
|
+
* Recommended maximum refresh token expiry: 7 days
|
|
51
|
+
*/
|
|
52
|
+
const RECOMMENDED_MAX_REFRESH_SECONDS = 7 * 24 * 60 * 60;
|
|
20
53
|
/**
|
|
21
54
|
* Reserved JWT claims that cannot be overridden via additionalClaims
|
|
22
55
|
*/
|
|
@@ -34,6 +67,22 @@ const RESERVED_JWT_CLAIMS = new Set([
|
|
|
34
67
|
// ============================================================================
|
|
35
68
|
// JWT Implementation
|
|
36
69
|
// ============================================================================
|
|
70
|
+
/**
|
|
71
|
+
* Validates a time string format
|
|
72
|
+
* Supports: '1s', '15m', '1h', '7d', etc.
|
|
73
|
+
* Minimum valid value is '1s' (1 second)
|
|
74
|
+
*
|
|
75
|
+
* @returns true if valid, false otherwise
|
|
76
|
+
*/
|
|
77
|
+
export function isValidTimespan(time) {
|
|
78
|
+
const match = time.match(/^(\d+)([smhd])$/);
|
|
79
|
+
if (!match) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
const value = parseInt(match[1], 10);
|
|
83
|
+
// Value must be at least 1
|
|
84
|
+
return value >= 1;
|
|
85
|
+
}
|
|
37
86
|
/**
|
|
38
87
|
* Parses time string to seconds
|
|
39
88
|
* Supports: '15m', '1h', '7d', '30d', etc.
|
|
@@ -41,7 +90,7 @@ const RESERVED_JWT_CLAIMS = new Set([
|
|
|
41
90
|
export function parseTimeToSeconds(time) {
|
|
42
91
|
const match = time.match(/^(\d+)([smhd])$/);
|
|
43
92
|
if (!match) {
|
|
44
|
-
throw new
|
|
93
|
+
throw new AuthError(`Invalid time format: ${time}. Use format like '15m', '1h', '7d'`, 400, 'INVALID_TIME_FORMAT');
|
|
45
94
|
}
|
|
46
95
|
const value = parseInt(match[1], 10);
|
|
47
96
|
const unit = match[2];
|
|
@@ -55,7 +104,7 @@ export function parseTimeToSeconds(time) {
|
|
|
55
104
|
case 'd':
|
|
56
105
|
return value * 60 * 60 * 24;
|
|
57
106
|
default:
|
|
58
|
-
throw new
|
|
107
|
+
throw new AuthError(`Unknown time unit: ${unit}`, 400, 'INVALID_TIME_UNIT');
|
|
59
108
|
}
|
|
60
109
|
}
|
|
61
110
|
/**
|
|
@@ -87,6 +136,49 @@ function createSignature(data, secret) {
|
|
|
87
136
|
export function generateTokenId() {
|
|
88
137
|
return randomBytes(16).toString('hex');
|
|
89
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* Validates token expiration against security bounds
|
|
141
|
+
*
|
|
142
|
+
* @param accessExpiry - Access token expiry string (e.g., '15m')
|
|
143
|
+
* @param refreshExpiry - Refresh token expiry string (e.g., '7d')
|
|
144
|
+
* @throws Error if expiration times are outside security bounds
|
|
145
|
+
*/
|
|
146
|
+
export function validateTokenExpiration(accessExpiry, refreshExpiry) {
|
|
147
|
+
const accessSeconds = parseTimeToSeconds(accessExpiry);
|
|
148
|
+
const refreshSeconds = parseTimeToSeconds(refreshExpiry);
|
|
149
|
+
// Validate access token bounds
|
|
150
|
+
if (accessSeconds < MIN_ACCESS_TOKEN_SECONDS) {
|
|
151
|
+
throw new AuthError(`Access token expiry (${accessExpiry} = ${accessSeconds}s) is below minimum of ` +
|
|
152
|
+
`${MIN_ACCESS_TOKEN_SECONDS}s (1 minute). Very short tokens cause excessive refreshes.`, 400, 'INVALID_TOKEN_EXPIRY');
|
|
153
|
+
}
|
|
154
|
+
if (accessSeconds > MAX_ACCESS_TOKEN_SECONDS) {
|
|
155
|
+
throw new AuthError(`Access token expiry (${accessExpiry} = ${accessSeconds}s) exceeds maximum of ` +
|
|
156
|
+
`${MAX_ACCESS_TOKEN_SECONDS}s (1 hour). Long-lived access tokens are a security risk.`, 400, 'INVALID_TOKEN_EXPIRY');
|
|
157
|
+
}
|
|
158
|
+
// Validate refresh token bounds
|
|
159
|
+
if (refreshSeconds < MIN_REFRESH_TOKEN_SECONDS) {
|
|
160
|
+
throw new AuthError(`Refresh token expiry (${refreshExpiry} = ${refreshSeconds}s) is below minimum of ` +
|
|
161
|
+
`${MIN_REFRESH_TOKEN_SECONDS}s (1 hour). Very short refresh tokens impact usability.`, 400, 'INVALID_TOKEN_EXPIRY');
|
|
162
|
+
}
|
|
163
|
+
if (refreshSeconds > MAX_REFRESH_TOKEN_SECONDS) {
|
|
164
|
+
throw new AuthError(`Refresh token expiry (${refreshExpiry} = ${refreshSeconds}s) exceeds maximum of ` +
|
|
165
|
+
`${MAX_REFRESH_TOKEN_SECONDS}s (30 days). Long-lived refresh tokens increase attack window.`, 400, 'INVALID_TOKEN_EXPIRY');
|
|
166
|
+
}
|
|
167
|
+
// Warn about exceeding recommended limits (non-fatal)
|
|
168
|
+
if (accessSeconds > RECOMMENDED_MAX_ACCESS_SECONDS) {
|
|
169
|
+
console.warn(`[Security] Access token expiry (${accessExpiry}) exceeds recommended maximum of 15 minutes. ` +
|
|
170
|
+
'Consider using shorter-lived access tokens with refresh.');
|
|
171
|
+
}
|
|
172
|
+
if (refreshSeconds > RECOMMENDED_MAX_REFRESH_SECONDS) {
|
|
173
|
+
console.warn(`[Security] Refresh token expiry (${refreshExpiry}) exceeds recommended maximum of 7 days. ` +
|
|
174
|
+
'Long-lived refresh tokens increase the window for token theft attacks.');
|
|
175
|
+
}
|
|
176
|
+
// Ensure refresh tokens outlive access tokens
|
|
177
|
+
if (refreshSeconds <= accessSeconds) {
|
|
178
|
+
throw new AuthError(`Refresh token expiry (${refreshExpiry} = ${refreshSeconds}s) must be longer than ` +
|
|
179
|
+
`access token expiry (${accessExpiry} = ${accessSeconds}s).`, 400, 'INVALID_TOKEN_EXPIRY');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
90
182
|
// ============================================================================
|
|
91
183
|
// JWT Manager Class
|
|
92
184
|
// ============================================================================
|
|
@@ -119,31 +211,56 @@ export class JwtManager {
|
|
|
119
211
|
constructor(config) {
|
|
120
212
|
// Validate secret length (Critical Fix #1)
|
|
121
213
|
if (!config.secret || config.secret.length < MIN_SECRET_LENGTH) {
|
|
122
|
-
throw new
|
|
123
|
-
'Generate with: openssl rand -base64 64');
|
|
214
|
+
throw new AuthError(`JWT secret must be at least ${MIN_SECRET_LENGTH} characters long (512 bits). ` +
|
|
215
|
+
'Generate with: openssl rand -base64 64', 500, 'INVALID_JWT_SECRET');
|
|
124
216
|
}
|
|
125
217
|
// Validate secret entropy - check for sufficient unique characters
|
|
126
218
|
const uniqueChars = new Set(config.secret).size;
|
|
127
219
|
if (uniqueChars < MIN_SECRET_ENTROPY_CHARS) {
|
|
128
|
-
throw new
|
|
129
|
-
'Use cryptographically random data with at least 16 unique characters.');
|
|
220
|
+
throw new AuthError(`JWT secret has insufficient entropy (only ${uniqueChars} unique characters). ` +
|
|
221
|
+
'Use cryptographically random data with at least 16 unique characters.', 500, 'INVALID_JWT_SECRET');
|
|
222
|
+
}
|
|
223
|
+
// Validate accessTokenExpiry format if provided
|
|
224
|
+
if (config.accessTokenExpiry !== undefined && !isValidTimespan(config.accessTokenExpiry)) {
|
|
225
|
+
throw new AuthError(`Invalid accessTokenExpiry "${config.accessTokenExpiry}". ` +
|
|
226
|
+
`Use formats like "15m", "1h", "7d". Minimum is "1s".`, 400, 'INVALID_TOKEN_EXPIRY');
|
|
227
|
+
}
|
|
228
|
+
// Validate refreshTokenExpiry format if provided
|
|
229
|
+
if (config.refreshTokenExpiry !== undefined && !isValidTimespan(config.refreshTokenExpiry)) {
|
|
230
|
+
throw new AuthError(`Invalid refreshTokenExpiry "${config.refreshTokenExpiry}". ` +
|
|
231
|
+
`Use formats like "15m", "1h", "7d". Minimum is "1s".`, 400, 'INVALID_TOKEN_EXPIRY');
|
|
130
232
|
}
|
|
233
|
+
// Store config with defaults
|
|
234
|
+
const accessExpiry = config.accessTokenExpiry ?? DEFAULT_ACCESS_EXPIRY;
|
|
235
|
+
const refreshExpiry = config.refreshTokenExpiry ?? DEFAULT_REFRESH_EXPIRY;
|
|
236
|
+
// Validate expiration bounds (Security Phase 3.1)
|
|
237
|
+
// This prevents developers from setting insecure expiration times
|
|
238
|
+
validateTokenExpiration(accessExpiry, refreshExpiry);
|
|
131
239
|
this.config = {
|
|
132
240
|
...config,
|
|
133
|
-
accessTokenExpiry:
|
|
134
|
-
refreshTokenExpiry:
|
|
241
|
+
accessTokenExpiry: accessExpiry,
|
|
242
|
+
refreshTokenExpiry: refreshExpiry,
|
|
135
243
|
};
|
|
136
244
|
}
|
|
137
245
|
/**
|
|
138
246
|
* Creates a JWT token with the given payload
|
|
247
|
+
*
|
|
248
|
+
* @param payload - Token payload (sub, email, type required)
|
|
249
|
+
* @param expiresIn - Expiration time string (e.g., '15m', '7d')
|
|
250
|
+
* @param options - Additional options
|
|
251
|
+
* @param options.notBefore - Delay in seconds before token becomes valid (default: 0)
|
|
139
252
|
*/
|
|
140
|
-
createToken(payload, expiresIn) {
|
|
253
|
+
createToken(payload, expiresIn, options) {
|
|
141
254
|
const now = Math.floor(Date.now() / 1000);
|
|
142
255
|
const exp = now + parseTimeToSeconds(expiresIn);
|
|
256
|
+
// Security Phase 3.3: Add not-before (nbf) claim
|
|
257
|
+
// nbf = issued at + optional delay (default: 0, meaning valid immediately)
|
|
258
|
+
const nbf = now + (options?.notBefore ?? 0);
|
|
143
259
|
const fullPayload = {
|
|
144
260
|
...payload,
|
|
145
261
|
iat: now,
|
|
146
262
|
exp,
|
|
263
|
+
nbf, // Token is not valid before this time
|
|
147
264
|
};
|
|
148
265
|
// Create header
|
|
149
266
|
const header = { alg: 'HS256', typ: 'JWT' };
|
|
@@ -157,12 +274,12 @@ export class JwtManager {
|
|
|
157
274
|
/**
|
|
158
275
|
* Verifies a JWT token and returns the payload
|
|
159
276
|
*
|
|
160
|
-
* @throws
|
|
277
|
+
* @throws AuthError if token is invalid or expired
|
|
161
278
|
*/
|
|
162
279
|
verifyToken(token) {
|
|
163
280
|
const parts = token.split('.');
|
|
164
281
|
if (parts.length !== 3) {
|
|
165
|
-
throw new
|
|
282
|
+
throw new AuthError('Invalid token format', 401, 'INVALID_TOKEN');
|
|
166
283
|
}
|
|
167
284
|
const [encodedHeader, encodedPayload, signature] = parts;
|
|
168
285
|
// Critical Fix #2: Validate algorithm BEFORE signature verification
|
|
@@ -172,14 +289,14 @@ export class JwtManager {
|
|
|
172
289
|
header = JSON.parse(base64urlDecode(encodedHeader));
|
|
173
290
|
}
|
|
174
291
|
catch {
|
|
175
|
-
throw new
|
|
292
|
+
throw new AuthError('Invalid token header', 401, 'INVALID_TOKEN');
|
|
176
293
|
}
|
|
177
294
|
// Only allow HS256 - reject "none", RS256, and other algorithms
|
|
178
295
|
if (header.alg !== 'HS256') {
|
|
179
|
-
throw new
|
|
296
|
+
throw new AuthError(`Invalid algorithm: ${header.alg}. Only HS256 is supported.`, 401, 'INVALID_TOKEN');
|
|
180
297
|
}
|
|
181
298
|
if (header.typ !== 'JWT') {
|
|
182
|
-
throw new
|
|
299
|
+
throw new AuthError('Invalid token type in header', 401, 'INVALID_TOKEN');
|
|
183
300
|
}
|
|
184
301
|
// Verify signature using timing-safe comparison to prevent timing attacks
|
|
185
302
|
const signatureInput = `${encodedHeader}.${encodedPayload}`;
|
|
@@ -187,7 +304,7 @@ export class JwtManager {
|
|
|
187
304
|
const sigBuffer = Buffer.from(signature, 'utf8');
|
|
188
305
|
const expectedBuffer = Buffer.from(expectedSignature, 'utf8');
|
|
189
306
|
if (sigBuffer.length !== expectedBuffer.length || !timingSafeEqual(sigBuffer, expectedBuffer)) {
|
|
190
|
-
throw new
|
|
307
|
+
throw new AuthError('Invalid token signature', 401, 'INVALID_TOKEN');
|
|
191
308
|
}
|
|
192
309
|
// Decode payload
|
|
193
310
|
let payload;
|
|
@@ -199,29 +316,32 @@ export class JwtManager {
|
|
|
199
316
|
typeof decoded.iat !== 'number' ||
|
|
200
317
|
typeof decoded.exp !== 'number' ||
|
|
201
318
|
(decoded.type !== 'access' && decoded.type !== 'refresh')) {
|
|
202
|
-
throw new
|
|
319
|
+
throw new AuthError('Missing required token fields', 401, 'INVALID_TOKEN');
|
|
203
320
|
}
|
|
204
321
|
payload = decoded;
|
|
205
322
|
}
|
|
206
323
|
catch (error) {
|
|
207
|
-
|
|
324
|
+
if (error instanceof AuthError) {
|
|
325
|
+
throw error;
|
|
326
|
+
}
|
|
327
|
+
throw new AuthError(error instanceof Error ? error.message : 'Invalid token payload', 401, 'INVALID_TOKEN');
|
|
208
328
|
}
|
|
209
329
|
// Check expiration
|
|
210
330
|
const now = Math.floor(Date.now() / 1000);
|
|
211
331
|
if (payload.exp < now) {
|
|
212
|
-
throw new
|
|
332
|
+
throw new AuthError('Token has expired', 401, 'TOKEN_EXPIRED');
|
|
213
333
|
}
|
|
214
334
|
// Check not-before claim if present (Medium Fix #10)
|
|
215
335
|
if (typeof payload.nbf === 'number' && payload.nbf > now) {
|
|
216
|
-
throw new
|
|
336
|
+
throw new AuthError('Token not yet valid', 401, 'TOKEN_NOT_YET_VALID');
|
|
217
337
|
}
|
|
218
338
|
// Verify issuer if configured
|
|
219
339
|
if (this.config.issuer && payload.iss !== this.config.issuer) {
|
|
220
|
-
throw new
|
|
340
|
+
throw new AuthError('Invalid token issuer', 401, 'INVALID_TOKEN');
|
|
221
341
|
}
|
|
222
342
|
// Verify audience if configured
|
|
223
343
|
if (this.config.audience && payload.aud !== this.config.audience) {
|
|
224
|
-
throw new
|
|
344
|
+
throw new AuthError('Invalid token audience', 401, 'INVALID_TOKEN');
|
|
225
345
|
}
|
|
226
346
|
return payload;
|
|
227
347
|
}
|
|
@@ -230,15 +350,15 @@ export class JwtManager {
|
|
|
230
350
|
*
|
|
231
351
|
* @param user - The user to create tokens for
|
|
232
352
|
* @param additionalClaims - Custom claims to include (cannot override reserved claims)
|
|
233
|
-
* @throws
|
|
353
|
+
* @throws AuthError if additionalClaims contains reserved JWT claims
|
|
234
354
|
*/
|
|
235
355
|
createTokenPair(user, additionalClaims) {
|
|
236
356
|
// Critical Fix #3: Validate additionalClaims don't contain reserved claims
|
|
237
357
|
if (additionalClaims) {
|
|
238
358
|
for (const key of Object.keys(additionalClaims)) {
|
|
239
359
|
if (RESERVED_JWT_CLAIMS.has(key)) {
|
|
240
|
-
throw new
|
|
241
|
-
`Reserved claims are: ${[...RESERVED_JWT_CLAIMS].join(', ')}
|
|
360
|
+
throw new AuthError(`Cannot override reserved JWT claim: ${key}. ` +
|
|
361
|
+
`Reserved claims are: ${[...RESERVED_JWT_CLAIMS].join(', ')}`, 400, 'INVALID_CLAIMS');
|
|
242
362
|
}
|
|
243
363
|
}
|
|
244
364
|
}
|
|
@@ -263,13 +383,13 @@ export class JwtManager {
|
|
|
263
383
|
refreshTokens(refreshToken, userLoader) {
|
|
264
384
|
const payload = this.verifyToken(refreshToken);
|
|
265
385
|
if (payload.type !== 'refresh') {
|
|
266
|
-
throw new
|
|
386
|
+
throw new AuthError('Invalid token type: expected refresh token', 401, 'INVALID_TOKEN');
|
|
267
387
|
}
|
|
268
388
|
// If userLoader provided, fetch fresh user data
|
|
269
389
|
if (userLoader) {
|
|
270
390
|
return userLoader(payload.sub).then((user) => {
|
|
271
391
|
if (!user) {
|
|
272
|
-
throw new
|
|
392
|
+
throw new AuthError('User not found', 401, 'USER_NOT_FOUND');
|
|
273
393
|
}
|
|
274
394
|
return this.createTokenPair(user);
|
|
275
395
|
});
|
|
@@ -313,11 +433,17 @@ export class JwtManager {
|
|
|
313
433
|
}
|
|
314
434
|
}
|
|
315
435
|
/**
|
|
316
|
-
* Creates a new JWT manager instance
|
|
436
|
+
* Creates a new JWT manager instance (succinct API)
|
|
317
437
|
*/
|
|
318
|
-
export function
|
|
438
|
+
export function jwtManager(config) {
|
|
319
439
|
return new JwtManager(config);
|
|
320
440
|
}
|
|
441
|
+
/**
|
|
442
|
+
* Creates a new JWT manager instance
|
|
443
|
+
*
|
|
444
|
+
* @deprecated Use `jwtManager()` instead. Will be removed in v0.9.
|
|
445
|
+
*/
|
|
446
|
+
export const createJwtManager = jwtManager;
|
|
321
447
|
/**
|
|
322
448
|
* Creates an in-memory token store for development and testing
|
|
323
449
|
*
|
package/dist/jwt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"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"}
|
package/dist/middleware.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import type { MiddlewareFunction } from '@veloxts/router';
|
|
|
7
7
|
import { JwtManager } from './jwt.js';
|
|
8
8
|
import type { AuthConfig, AuthContext, AuthMiddlewareOptions, GuardDefinition, User } from './types.js';
|
|
9
9
|
/**
|
|
10
|
-
* Creates an authentication middleware for procedures
|
|
10
|
+
* Creates an authentication middleware for procedures (succinct API)
|
|
11
11
|
*
|
|
12
12
|
* This middleware:
|
|
13
13
|
* 1. Extracts JWT from Authorization header
|
|
@@ -18,7 +18,7 @@ import type { AuthConfig, AuthContext, AuthMiddlewareOptions, GuardDefinition, U
|
|
|
18
18
|
*
|
|
19
19
|
* @example
|
|
20
20
|
* ```typescript
|
|
21
|
-
* const auth =
|
|
21
|
+
* const auth = authMiddleware(authConfig);
|
|
22
22
|
*
|
|
23
23
|
* // Use in procedures
|
|
24
24
|
* const getProfile = procedure()
|
|
@@ -43,7 +43,7 @@ import type { AuthConfig, AuthContext, AuthMiddlewareOptions, GuardDefinition, U
|
|
|
43
43
|
* });
|
|
44
44
|
* ```
|
|
45
45
|
*/
|
|
46
|
-
export declare function
|
|
46
|
+
export declare function authMiddleware(config: AuthConfig): {
|
|
47
47
|
middleware: <TInput, TContext extends BaseContext, TOutput>(options?: AuthMiddlewareOptions) => MiddlewareFunction<TInput, TContext, TContext & {
|
|
48
48
|
user?: User;
|
|
49
49
|
auth: AuthContext;
|
|
@@ -59,11 +59,17 @@ export declare function createAuthMiddleware(config: AuthConfig): {
|
|
|
59
59
|
jwt: JwtManager;
|
|
60
60
|
};
|
|
61
61
|
/**
|
|
62
|
-
* Creates
|
|
62
|
+
* Creates an authentication middleware for procedures
|
|
63
|
+
*
|
|
64
|
+
* @deprecated Use `authMiddleware()` instead. Will be removed in v0.9.
|
|
65
|
+
*/
|
|
66
|
+
export declare const createAuthMiddleware: typeof authMiddleware;
|
|
67
|
+
/**
|
|
68
|
+
* Creates a rate limiting middleware (succinct API)
|
|
63
69
|
*
|
|
64
70
|
* @example
|
|
65
71
|
* ```typescript
|
|
66
|
-
* const rateLimit =
|
|
72
|
+
* const rateLimit = rateLimitMiddleware({
|
|
67
73
|
* max: 100,
|
|
68
74
|
* windowMs: 60000, // 1 minute
|
|
69
75
|
* });
|
|
@@ -74,12 +80,18 @@ export declare function createAuthMiddleware(config: AuthConfig): {
|
|
|
74
80
|
* .mutation(handler);
|
|
75
81
|
* ```
|
|
76
82
|
*/
|
|
77
|
-
export declare function
|
|
83
|
+
export declare function rateLimitMiddleware<TInput, TContext extends BaseContext, TOutput>(options: {
|
|
78
84
|
max?: number;
|
|
79
85
|
windowMs?: number;
|
|
80
86
|
keyGenerator?: (ctx: TContext) => string;
|
|
81
87
|
message?: string;
|
|
82
88
|
}): MiddlewareFunction<TInput, TContext, TContext, TOutput>;
|
|
89
|
+
/**
|
|
90
|
+
* Creates a rate limiting middleware
|
|
91
|
+
*
|
|
92
|
+
* @deprecated Use `rateLimitMiddleware()` instead. Will be removed in v0.9.
|
|
93
|
+
*/
|
|
94
|
+
export declare const createRateLimitMiddleware: typeof rateLimitMiddleware;
|
|
83
95
|
/**
|
|
84
96
|
* Clears rate limit store (useful for testing)
|
|
85
97
|
*/
|
package/dist/middleware.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,eAAe,EAEf,IAAI,EACL,MAAM,YAAY,CAAC;AAOpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,eAAe,EAEf,IAAI,EACL,MAAM,YAAY,CAAC;AAOpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU;iBAM3B,MAAM,EAAE,QAAQ,SAAS,WAAW,EAAE,OAAO,YACtD,qBAAqB,KAC7B,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG;QAAE,IAAI,CAAC,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE,EAAE,OAAO,CAAC;kBA8H1E,MAAM,EAAE,QAAQ,SAAS,WAAW,EAAE,OAAO,WACvD,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC,KACvC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE,EAAE,OAAO,CAAC;mBAYxE,MAAM,EAAE,QAAQ,SAAS,WAAW,EAAE,OAAO,OAAK,kBAAkB,CACxF,MAAM,EACN,QAAQ,EACR,QAAQ,GAAG;QAAE,IAAI,CAAC,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE,EAC7C,OAAO,CACR;;EAUF;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,uBAAiB,CAAC;AAkBnD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,SAAS,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE;IAC1F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,MAAM,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAuC1D;AAED;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,4BAAsB,CAAC;AAE7D;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C"}
|
package/dist/middleware.js
CHANGED
|
@@ -9,7 +9,7 @@ import { AuthError } from './types.js';
|
|
|
9
9
|
// Auth Middleware Factory
|
|
10
10
|
// ============================================================================
|
|
11
11
|
/**
|
|
12
|
-
* Creates an authentication middleware for procedures
|
|
12
|
+
* Creates an authentication middleware for procedures (succinct API)
|
|
13
13
|
*
|
|
14
14
|
* This middleware:
|
|
15
15
|
* 1. Extracts JWT from Authorization header
|
|
@@ -20,7 +20,7 @@ import { AuthError } from './types.js';
|
|
|
20
20
|
*
|
|
21
21
|
* @example
|
|
22
22
|
* ```typescript
|
|
23
|
-
* const auth =
|
|
23
|
+
* const auth = authMiddleware(authConfig);
|
|
24
24
|
*
|
|
25
25
|
* // Use in procedures
|
|
26
26
|
* const getProfile = procedure()
|
|
@@ -45,7 +45,7 @@ import { AuthError } from './types.js';
|
|
|
45
45
|
* });
|
|
46
46
|
* ```
|
|
47
47
|
*/
|
|
48
|
-
export function
|
|
48
|
+
export function authMiddleware(config) {
|
|
49
49
|
const jwt = new JwtManager(config.jwt);
|
|
50
50
|
/**
|
|
51
51
|
* Creates the actual middleware function
|
|
@@ -170,6 +170,12 @@ export function createAuthMiddleware(config) {
|
|
|
170
170
|
jwt,
|
|
171
171
|
};
|
|
172
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Creates an authentication middleware for procedures
|
|
175
|
+
*
|
|
176
|
+
* @deprecated Use `authMiddleware()` instead. Will be removed in v0.9.
|
|
177
|
+
*/
|
|
178
|
+
export const createAuthMiddleware = authMiddleware;
|
|
173
179
|
// ============================================================================
|
|
174
180
|
// Error Helpers
|
|
175
181
|
// ============================================================================
|
|
@@ -183,11 +189,11 @@ export function createAuthMiddleware(config) {
|
|
|
183
189
|
*/
|
|
184
190
|
const rateLimitStore = new Map();
|
|
185
191
|
/**
|
|
186
|
-
* Creates a rate limiting middleware
|
|
192
|
+
* Creates a rate limiting middleware (succinct API)
|
|
187
193
|
*
|
|
188
194
|
* @example
|
|
189
195
|
* ```typescript
|
|
190
|
-
* const rateLimit =
|
|
196
|
+
* const rateLimit = rateLimitMiddleware({
|
|
191
197
|
* max: 100,
|
|
192
198
|
* windowMs: 60000, // 1 minute
|
|
193
199
|
* });
|
|
@@ -198,7 +204,7 @@ const rateLimitStore = new Map();
|
|
|
198
204
|
* .mutation(handler);
|
|
199
205
|
* ```
|
|
200
206
|
*/
|
|
201
|
-
export function
|
|
207
|
+
export function rateLimitMiddleware(options) {
|
|
202
208
|
const max = options.max ?? 100;
|
|
203
209
|
const windowMs = options.windowMs ?? 60000;
|
|
204
210
|
const keyGenerator = options.keyGenerator ?? ((ctx) => ctx.request.ip ?? 'unknown');
|
|
@@ -221,17 +227,23 @@ export function createRateLimitMiddleware(options) {
|
|
|
221
227
|
// Increment count
|
|
222
228
|
record.count++;
|
|
223
229
|
}
|
|
224
|
-
//
|
|
225
|
-
if (record.count > max) {
|
|
226
|
-
throw new AuthError(message, 429, 'RATE_LIMIT_EXCEEDED');
|
|
227
|
-
}
|
|
228
|
-
// Add rate limit headers
|
|
230
|
+
// Add rate limit headers (always, even on 429 responses)
|
|
229
231
|
ctx.reply.header('X-RateLimit-Limit', String(max));
|
|
230
232
|
ctx.reply.header('X-RateLimit-Remaining', String(Math.max(0, max - record.count)));
|
|
231
233
|
ctx.reply.header('X-RateLimit-Reset', String(Math.ceil(record.resetAt / 1000)));
|
|
234
|
+
// Check limit (after setting headers so they're included in 429 response)
|
|
235
|
+
if (record.count > max) {
|
|
236
|
+
throw new AuthError(message, 429, 'RATE_LIMIT_EXCEEDED');
|
|
237
|
+
}
|
|
232
238
|
return next();
|
|
233
239
|
};
|
|
234
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* Creates a rate limiting middleware
|
|
243
|
+
*
|
|
244
|
+
* @deprecated Use `rateLimitMiddleware()` instead. Will be removed in v0.9.
|
|
245
|
+
*/
|
|
246
|
+
export const createRateLimitMiddleware = rateLimitMiddleware;
|
|
235
247
|
/**
|
|
236
248
|
* Clears rate limit store (useful for testing)
|
|
237
249
|
*/
|