@wazobiatech/auth-middleware 1.0.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.
Files changed (66) hide show
  1. package/README.md +986 -0
  2. package/dist/index.d.ts +9 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +25 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/middlewares/express.helper.d.ts +4 -0
  7. package/dist/middlewares/express.helper.d.ts.map +1 -0
  8. package/dist/middlewares/express.helper.js +31 -0
  9. package/dist/middlewares/express.helper.js.map +1 -0
  10. package/dist/middlewares/gql.helper.d.ts +14 -0
  11. package/dist/middlewares/gql.helper.d.ts.map +1 -0
  12. package/dist/middlewares/gql.helper.js +82 -0
  13. package/dist/middlewares/gql.helper.js.map +1 -0
  14. package/dist/middlewares/index.d.ts +5 -0
  15. package/dist/middlewares/index.d.ts.map +1 -0
  16. package/dist/middlewares/index.js +13 -0
  17. package/dist/middlewares/index.js.map +1 -0
  18. package/dist/middlewares/jwt.guard.d.ts +16 -0
  19. package/dist/middlewares/jwt.guard.d.ts.map +1 -0
  20. package/dist/middlewares/jwt.guard.js +336 -0
  21. package/dist/middlewares/jwt.guard.js.map +1 -0
  22. package/dist/middlewares/project.guard.d.ts +49 -0
  23. package/dist/middlewares/project.guard.d.ts.map +1 -0
  24. package/dist/middlewares/project.guard.js +310 -0
  25. package/dist/middlewares/project.guard.js.map +1 -0
  26. package/dist/nestjs/decorators/auth.decorator.d.ts +2 -0
  27. package/dist/nestjs/decorators/auth.decorator.d.ts.map +1 -0
  28. package/dist/nestjs/decorators/auth.decorator.js +10 -0
  29. package/dist/nestjs/decorators/auth.decorator.js.map +1 -0
  30. package/dist/nestjs/decorators/current-user.decorator.d.ts +2 -0
  31. package/dist/nestjs/decorators/current-user.decorator.d.ts.map +1 -0
  32. package/dist/nestjs/decorators/current-user.decorator.js +18 -0
  33. package/dist/nestjs/decorators/current-user.decorator.js.map +1 -0
  34. package/dist/nestjs/guards/jwt-guard.d.ts +8 -0
  35. package/dist/nestjs/guards/jwt-guard.d.ts.map +1 -0
  36. package/dist/nestjs/guards/jwt-guard.js +23 -0
  37. package/dist/nestjs/guards/jwt-guard.js.map +1 -0
  38. package/dist/nestjs/guards/project.guard.d.ts +45 -0
  39. package/dist/nestjs/guards/project.guard.d.ts.map +1 -0
  40. package/dist/nestjs/guards/project.guard.js +352 -0
  41. package/dist/nestjs/guards/project.guard.js.map +1 -0
  42. package/dist/nestjs/index.d.ts +6 -0
  43. package/dist/nestjs/index.d.ts.map +1 -0
  44. package/dist/nestjs/index.js +14 -0
  45. package/dist/nestjs/index.js.map +1 -0
  46. package/dist/nestjs/jwt-auth.module.d.ts +3 -0
  47. package/dist/nestjs/jwt-auth.module.d.ts.map +1 -0
  48. package/dist/nestjs/jwt-auth.module.js +25 -0
  49. package/dist/nestjs/jwt-auth.module.js.map +1 -0
  50. package/dist/nestjs/strategies/jwt-strategy.d.ts +23 -0
  51. package/dist/nestjs/strategies/jwt-strategy.d.ts.map +1 -0
  52. package/dist/nestjs/strategies/jwt-strategy.js +381 -0
  53. package/dist/nestjs/strategies/jwt-strategy.js.map +1 -0
  54. package/dist/test/middleware.test.d.ts +2 -0
  55. package/dist/test/middleware.test.d.ts.map +1 -0
  56. package/dist/test/middleware.test.js +383 -0
  57. package/dist/test/middleware.test.js.map +1 -0
  58. package/dist/types/jwt-payload.d.ts +48 -0
  59. package/dist/types/jwt-payload.d.ts.map +1 -0
  60. package/dist/types/jwt-payload.js +3 -0
  61. package/dist/types/jwt-payload.js.map +1 -0
  62. package/dist/utils/redis.connection.d.ts +9 -0
  63. package/dist/utils/redis.connection.d.ts.map +1 -0
  64. package/dist/utils/redis.connection.js +27 -0
  65. package/dist/utils/redis.connection.js.map +1 -0
  66. package/package.json +99 -0
@@ -0,0 +1,381 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.JwtStrategy = void 0;
49
+ const common_1 = require("@nestjs/common");
50
+ const passport_1 = require("@nestjs/passport");
51
+ const passport_jwt_1 = require("passport-jwt");
52
+ const jose = __importStar(require("node-jose"));
53
+ const axios_1 = __importDefault(require("axios"));
54
+ const crypto = __importStar(require("crypto"));
55
+ const redis_connection_1 = __importDefault(require("../../utils/redis.connection"));
56
+ const jsonwebtoken = __importStar(require("jsonwebtoken"));
57
+ require("dotenv/config");
58
+ let JwtStrategy = class JwtStrategy extends (0, passport_1.PassportStrategy)(passport_jwt_1.Strategy) {
59
+ constructor() {
60
+ super({
61
+ jwtFromRequest: passport_jwt_1.ExtractJwt.fromAuthHeaderAsBearerToken(),
62
+ ignoreExpiration: false,
63
+ secretOrKeyProvider: (request, rawJwtToken, done) => {
64
+ // Store the raw token in the request object instead of instance variable
65
+ request.rawJwtToken = rawJwtToken;
66
+ this.getSigningKey(rawJwtToken)
67
+ .then((key) => {
68
+ done(null, key);
69
+ })
70
+ .catch((error) => {
71
+ done(error, undefined);
72
+ });
73
+ },
74
+ algorithms: ['RS512'],
75
+ passReqToCallback: true, // This ensures the request object is passed to validate
76
+ });
77
+ this.jwksCache = new Map();
78
+ const domain = process.env?.MERCURY_BASE_URL ?? 'http://localhost:4000';
79
+ this.expectedIssuer = domain;
80
+ }
81
+ decodeJWTTokenForProjectUuid(rawJwtToken) {
82
+ try {
83
+ // Validate JWT structure first
84
+ const parts = rawJwtToken.split('.');
85
+ if (parts.length !== 3) {
86
+ return null;
87
+ }
88
+ // Decode without verification (we just need the payload for project_uuid)
89
+ const decoded = jsonwebtoken.decode(rawJwtToken);
90
+ if (!decoded) {
91
+ return null;
92
+ }
93
+ // Return project_uuid if it exists, otherwise null
94
+ if (typeof decoded === 'object' &&
95
+ decoded !== null &&
96
+ 'project_uuid' in decoded) {
97
+ const projectUuid = decoded.project_uuid || null;
98
+ return projectUuid;
99
+ }
100
+ return null;
101
+ }
102
+ catch (error) {
103
+ return null;
104
+ }
105
+ }
106
+ getJwksUriAndPath(projectUuid) {
107
+ const domain = process.env?.MERCURY_BASE_URL ?? 'localhost';
108
+ let path;
109
+ if (projectUuid) {
110
+ path = `auth/projects/${projectUuid}/.well-known/jwks.json`;
111
+ }
112
+ else {
113
+ // Fallback to default project UUID from environment
114
+ const defaultProjectUuid = process.env?.NEXUS_ID;
115
+ if (!defaultProjectUuid) {
116
+ throw new common_1.UnauthorizedException('No project UUID found in token and no default project UUID configured');
117
+ }
118
+ path = `auth/projects/${defaultProjectUuid}/.well-known/jwks.json`;
119
+ }
120
+ const uri = `${domain}/${path}`;
121
+ return { uri, path };
122
+ }
123
+ async fetchJWKS(jwksUri, path) {
124
+ try {
125
+ const timestamp = Date.now().toString();
126
+ const signatureInput = 'GET' + `/${path}` + timestamp;
127
+ const sharedSecret = process.env?.SIGNATURE_SHARED_SECRET;
128
+ const signature = crypto
129
+ .createHmac('sha256', sharedSecret)
130
+ .update(signatureInput)
131
+ .digest('hex');
132
+ const headers = {
133
+ Accept: 'application/json',
134
+ 'User-Agent': 'Service-JWT-Strategy/1.0',
135
+ 'X-Timestamp': timestamp,
136
+ 'X-Signature': signature,
137
+ };
138
+ const response = await axios_1.default.get(jwksUri, {
139
+ timeout: 10000, // 10 second timeout
140
+ headers,
141
+ });
142
+ if (!response.data || !response.data.keys) {
143
+ throw new Error('Invalid JWKS response: missing keys');
144
+ }
145
+ // Handle both standard JWKS format and your custom format
146
+ let jwksData;
147
+ if (Array.isArray(response.data.keys)) {
148
+ // Standard JWKS format: { "keys": [key1, key2, ...] }
149
+ jwksData = response.data;
150
+ }
151
+ else {
152
+ jwksData = {
153
+ keys: [response.data.keys], // Convert single key object to array
154
+ };
155
+ }
156
+ // Create keystore from normalized JWKS data
157
+ const keyStore = await jose.JWK.asKeyStore(jwksData);
158
+ return keyStore;
159
+ }
160
+ catch (error) {
161
+ // Type guard for axios errors
162
+ if (axios_1.default.isAxiosError(error)) {
163
+ const axiosError = error;
164
+ // Handle network errors
165
+ if (axiosError.code === 'ENOTFOUND') {
166
+ throw new common_1.UnauthorizedException('JWKS endpoint not reachable');
167
+ }
168
+ else if (axiosError.code === 'ETIMEDOUT') {
169
+ throw new common_1.UnauthorizedException('JWKS endpoint timeout');
170
+ }
171
+ else if (axiosError.code === 'CERT_REQUIRED' ||
172
+ axiosError.code === 'UNABLE_TO_GET_LOCAL_ISSUER_CERT') {
173
+ throw new common_1.UnauthorizedException('Client certificate authentication failed');
174
+ }
175
+ else if (axiosError.response?.status) {
176
+ throw new common_1.UnauthorizedException(`JWKS endpoint returned ${axiosError.response.status}: ${axiosError.response.statusText}`);
177
+ }
178
+ else {
179
+ const message = axiosError.message || 'Unknown error';
180
+ throw new common_1.UnauthorizedException(`Failed to fetch JWKS: ${message}`);
181
+ }
182
+ }
183
+ else {
184
+ // Handle non-axios errors
185
+ const errorMessage = error instanceof Error ? error.message : String(error);
186
+ throw new common_1.UnauthorizedException(`Failed to fetch JWKS: ${errorMessage}`);
187
+ }
188
+ }
189
+ }
190
+ async getSigningKey(rawJwtToken) {
191
+ try {
192
+ // Validate JWT format
193
+ const parts = rawJwtToken.split('.');
194
+ if (parts.length !== 3) {
195
+ throw new Error(`Invalid JWT format: expected 3 parts, got ${parts.length}`);
196
+ }
197
+ // Parse JWT header to get key ID
198
+ const headerBase64 = parts[0];
199
+ const headerJson = Buffer.from(headerBase64, 'base64').toString();
200
+ const header = JSON.parse(headerJson);
201
+ if (!header.kid) {
202
+ throw new Error('Missing key ID (kid) in token header');
203
+ }
204
+ // Extract project UUID from token
205
+ const projectUuid = this.decodeJWTTokenForProjectUuid(rawJwtToken);
206
+ const { uri: jwksUri, path } = this.getJwksUriAndPath(projectUuid);
207
+ // Create cache key based on project UUID (or 'default' if no project)
208
+ const cacheKey = projectUuid || 'default';
209
+ // Check cache and refresh if needed
210
+ const cachedEntry = this.jwksCache.get(cacheKey);
211
+ let keyStore;
212
+ if (!cachedEntry || Date.now() > cachedEntry.expiry) {
213
+ keyStore = await this.fetchJWKS(jwksUri, path);
214
+ // Cache for 10 minutes
215
+ const expiryTime = Date.now() + 600000;
216
+ this.jwksCache.set(cacheKey, {
217
+ keyStore: keyStore,
218
+ expiry: expiryTime,
219
+ });
220
+ }
221
+ else {
222
+ keyStore = cachedEntry.keyStore;
223
+ }
224
+ // Find the key in the keystore
225
+ const key = keyStore.get(header.kid);
226
+ if (!key) {
227
+ throw new Error(`Key ${header.kid} not found in JWKS for project ${projectUuid || 'default'}`);
228
+ }
229
+ // Convert to PEM format (public key only)
230
+ const publicKey = key.toPEM(false);
231
+ return publicKey;
232
+ }
233
+ catch (error) {
234
+ const errorMessage = error instanceof Error ? error.message : String(error);
235
+ throw new common_1.UnauthorizedException(`Unable to get signing key: ${errorMessage}`);
236
+ }
237
+ }
238
+ createTokenCacheKey(rawToken) {
239
+ // Create a more unique cache key using token hash + first 32 chars
240
+ const tokenHash = crypto
241
+ .createHash('sha256')
242
+ .update(rawToken)
243
+ .digest('hex')
244
+ .substring(0, 32);
245
+ const cacheKey = `validated_token:${tokenHash}`;
246
+ return cacheKey;
247
+ }
248
+ async cacheValidatedToken(payload, rawToken) {
249
+ try {
250
+ const redis = await redis_connection_1.default.getInstance();
251
+ const cacheExpiryTime = process.env?.CACHE_EXPIRY_TIME || 3600; // Default 1 hour
252
+ const cacheKey = this.createTokenCacheKey(rawToken);
253
+ // Cache the validated payload with additional metadata for debugging
254
+ const cacheData = {
255
+ payload,
256
+ cachedAt: Date.now(),
257
+ tokenPreview: rawToken.substring(0, 50) + '...', // For debugging
258
+ };
259
+ const cacheDataString = JSON.stringify(cacheData);
260
+ await redis.set(cacheKey, cacheDataString, {
261
+ EX: cacheExpiryTime,
262
+ });
263
+ }
264
+ catch (error) { }
265
+ }
266
+ async getCachedToken(rawToken) {
267
+ try {
268
+ const redis = await redis_connection_1.default.getInstance();
269
+ const cacheKey = this.createTokenCacheKey(rawToken);
270
+ const cachedData = await redis.get(cacheKey);
271
+ if (cachedData && typeof cachedData === 'string') {
272
+ const { payload, cachedAt } = JSON.parse(cachedData);
273
+ // Validate cached payload structure BEFORE using it
274
+ if (!payload || !payload.sub || !payload.sub.uuid || !payload.sub.email) {
275
+ await redis.del(cacheKey);
276
+ return null;
277
+ }
278
+ // Double check expiration (in case cache TTL and token TTL differ)
279
+ const now = Math.floor(Date.now() / 1000);
280
+ if (payload.exp && payload.exp < now) {
281
+ // Token expired, remove from cache
282
+ await redis.del(cacheKey);
283
+ return null;
284
+ }
285
+ return payload;
286
+ }
287
+ return null;
288
+ }
289
+ catch (error) {
290
+ // Clean up potentially corrupted cache entry
291
+ try {
292
+ const cacheKey = this.createTokenCacheKey(rawToken);
293
+ const redis = await redis_connection_1.default.getInstance();
294
+ await redis.del(cacheKey);
295
+ }
296
+ catch (cleanupError) { }
297
+ return null;
298
+ }
299
+ }
300
+ // Extract raw token from request instead of using instance variable
301
+ extractRawTokenFromRequest(request) {
302
+ // Check if we stored it during secretOrKeyProvider
303
+ if (request.rawJwtToken) {
304
+ const token = request.rawJwtToken;
305
+ return token;
306
+ }
307
+ // Fallback: extract from Authorization header
308
+ const authHeader = request.headers.authorization;
309
+ if (authHeader && authHeader.startsWith('Bearer ')) {
310
+ const token = authHeader.substring(7);
311
+ return token;
312
+ }
313
+ return null;
314
+ }
315
+ // Modified validate method - now receives the request object
316
+ async validate(request, payload) {
317
+ // Get the raw token from the request instead of instance variable
318
+ const rawToken = this.extractRawTokenFromRequest(request);
319
+ // First, try to get from cache if we have the raw token
320
+ if (rawToken) {
321
+ const cachedPayload = await this.getCachedToken(rawToken);
322
+ if (cachedPayload) {
323
+ // Return cleaned user object from cache
324
+ const user = {
325
+ uuid: cachedPayload.sub.uuid,
326
+ email: cachedPayload.sub.email,
327
+ name: cachedPayload.sub.name,
328
+ };
329
+ return user;
330
+ }
331
+ }
332
+ // Validate issuer
333
+ if (payload.iss !== process.env?.MERCURY_BASE_URL) {
334
+ throw new common_1.UnauthorizedException(`Invalid issuer. Expected: ${this.expectedIssuer}, Got: ${payload.iss}`);
335
+ }
336
+ // Validate subject (userUuid)
337
+ if (!payload.sub) {
338
+ throw new common_1.UnauthorizedException('Missing subject (userUuid)');
339
+ }
340
+ // Validate timestamps
341
+ const now = Math.floor(Date.now() / 1000);
342
+ if (payload.exp && payload.exp < now) {
343
+ throw new common_1.UnauthorizedException('Token expired');
344
+ }
345
+ if (payload.nbf && payload.nbf > now) {
346
+ throw new common_1.UnauthorizedException('Token not yet valid');
347
+ }
348
+ // Check Redis for token revocation
349
+ if (payload.jti) {
350
+ try {
351
+ const redis = await redis_connection_1.default.getInstance();
352
+ const revocationKey = `revoked_token:${payload.jti}`;
353
+ const isRevoked = await redis.get(revocationKey);
354
+ if (isRevoked) {
355
+ throw new common_1.UnauthorizedException('Token has been revoked');
356
+ }
357
+ }
358
+ catch (error) {
359
+ const errorMessage = error instanceof Error ? error.message : String(error);
360
+ throw new common_1.UnauthorizedException(`Redis error: ${errorMessage}`);
361
+ }
362
+ }
363
+ // Cache the validated token
364
+ if (rawToken) {
365
+ await this.cacheValidatedToken(payload, rawToken);
366
+ }
367
+ const user = {
368
+ uuid: payload.sub.uuid,
369
+ email: payload.sub.email,
370
+ name: payload.sub.name,
371
+ };
372
+ // Return cleaned user object (this becomes req.user)
373
+ return user;
374
+ }
375
+ };
376
+ exports.JwtStrategy = JwtStrategy;
377
+ exports.JwtStrategy = JwtStrategy = __decorate([
378
+ (0, common_1.Injectable)(),
379
+ __metadata("design:paramtypes", [])
380
+ ], JwtStrategy);
381
+ //# sourceMappingURL=jwt-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-strategy.js","sourceRoot":"","sources":["../../../src/nestjs/strategies/jwt-strategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=middleware.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.test.d.ts","sourceRoot":"","sources":["../../src/test/middleware.test.ts"],"names":[],"mappings":""}