@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,352 @@
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
+ var ProjectAuthGuard_1;
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.ProjectAuthGuard = void 0;
50
+ const common_1 = require("@nestjs/common");
51
+ const jwt = __importStar(require("jsonwebtoken"));
52
+ const axios_1 = __importDefault(require("axios"));
53
+ const jose = __importStar(require("node-jose"));
54
+ const crypto = __importStar(require("crypto"));
55
+ const redis_connection_1 = __importDefault(require("../../utils/redis.connection"));
56
+ let ProjectAuthGuard = ProjectAuthGuard_1 = class ProjectAuthGuard {
57
+ constructor() {
58
+ this.logger = new common_1.Logger(ProjectAuthGuard_1.name);
59
+ this.jwksCacheKey = 'project_jwks_cache';
60
+ this.jwksCacheTTL = 18000; // 5 hours in seconds
61
+ }
62
+ async canActivate(context) {
63
+ try {
64
+ // Handle both HTTP and GraphQL contexts
65
+ const request = this.getRequest(context);
66
+ if (!request || !request.headers) {
67
+ this.logger.error('Request or headers not available');
68
+ throw new common_1.UnauthorizedException('Request context not available');
69
+ }
70
+ // Extract project token from header
71
+ const authHeader = request.headers['x-project-token'];
72
+ if (!authHeader) {
73
+ this.logger.warn('Missing x-project-token header');
74
+ this.logger.debug('Available headers:', Object.keys(request.headers));
75
+ throw new common_1.UnauthorizedException('Missing project token header (x-project-token)');
76
+ }
77
+ // Handle Bearer prefix
78
+ const token = authHeader.startsWith('Bearer ')
79
+ ? authHeader.slice(7)
80
+ : authHeader;
81
+ if (!token) {
82
+ this.logger.warn('Empty project token after extraction');
83
+ throw new common_1.UnauthorizedException('Empty project token');
84
+ }
85
+ // Validate project token using cached JWKS
86
+ const validation = await this.validateProjectToken(token);
87
+ if (!validation.isValid) {
88
+ this.logger.warn(`Token validation failed: ${validation.error}`);
89
+ throw new common_1.UnauthorizedException(`Invalid project token: ${validation.error}`);
90
+ }
91
+ // Check if current service is enabled
92
+ const serviceId = process.env.SERVICE_ID;
93
+ if (!serviceId) {
94
+ this.logger.error('SERVICE_ID environment variable not configured');
95
+ throw new common_1.UnauthorizedException('Service ID not configured');
96
+ }
97
+ const hasAccess = validation.payload.enabled_services.includes(serviceId);
98
+ if (!hasAccess) {
99
+ this.logger.warn(`Service access denied - Service: ${serviceId}, Enabled: [${validation.payload.enabled_services.join(', ')}]`);
100
+ throw new common_1.UnauthorizedException(`Service '${serviceId}' not enabled for project ${validation.payload.project_uuid}`);
101
+ }
102
+ // Inject project context into request (no user context)
103
+ const projectContext = {
104
+ project_uuid: validation.payload.project_uuid,
105
+ enabled_services: validation.payload.enabled_services,
106
+ secret_version: validation.payload.secret_version,
107
+ token_id: validation.payload.token_id,
108
+ expires_at: validation.payload.exp
109
+ };
110
+ request.project = projectContext;
111
+ this.logger.log(`Authentication successful for project: ${projectContext.project_uuid}, service: ${serviceId}`);
112
+ return true;
113
+ }
114
+ catch (error) {
115
+ if (error instanceof common_1.UnauthorizedException) {
116
+ throw error;
117
+ }
118
+ this.logger.error('Project authentication failed:', error.message);
119
+ throw new common_1.UnauthorizedException('Authentication service error');
120
+ }
121
+ }
122
+ /**
123
+ * Extract request object from different NestJS contexts
124
+ */
125
+ getRequest(context) {
126
+ const contextType = context.getType();
127
+ if (contextType === 'graphql') {
128
+ // GraphQL context
129
+ const gqlContext = context.getArgByIndex(2);
130
+ return gqlContext?.req || gqlContext?.request;
131
+ }
132
+ else {
133
+ // HTTP context
134
+ return context.switchToHttp().getRequest();
135
+ }
136
+ }
137
+ /**
138
+ * Validate project token using cached JWKS + RSA verification
139
+ */
140
+ async validateProjectToken(token) {
141
+ try {
142
+ // Get public key from cached JWKS
143
+ const publicKey = await this.getPublicKeyFromCache(token);
144
+ // Verify JWT with RSA public key
145
+ const verified = jwt.verify(token, publicKey, {
146
+ algorithms: ['RS512'],
147
+ ignoreExpiration: false,
148
+ });
149
+ if (typeof verified !== 'object' || verified === null) {
150
+ return {
151
+ isValid: false,
152
+ error: 'Invalid token payload'
153
+ };
154
+ }
155
+ const payload = verified;
156
+ // Validate project token structure
157
+ if (!payload.project_uuid || !payload.token_id || !Array.isArray(payload.enabled_services)) {
158
+ return {
159
+ isValid: false,
160
+ error: 'Invalid project token structure'
161
+ };
162
+ }
163
+ const currentSecretVersion = await this.getCurrentProjectSecretVersion(payload.project_uuid);
164
+ if (currentSecretVersion > 0 && payload.secret_version < currentSecretVersion) {
165
+ return {
166
+ isValid: false,
167
+ error: `Token secret version outdated (token: ${payload.secret_version}, current: ${currentSecretVersion}) - re-authentication required`
168
+ };
169
+ }
170
+ // Check if token is in Redis cache (for revocation)
171
+ const redis = await redis_connection_1.default.getInstance();
172
+ const tokenExists = await redis.sendCommand([
173
+ 'EXISTS',
174
+ `project_token:${payload.token_id}`
175
+ ]);
176
+ if (tokenExists === 0) {
177
+ return {
178
+ isValid: false,
179
+ error: 'Token has been revoked'
180
+ };
181
+ }
182
+ return {
183
+ isValid: true,
184
+ payload
185
+ };
186
+ }
187
+ catch (error) {
188
+ this.logger.error('Token validation error:', error.message);
189
+ return {
190
+ isValid: false,
191
+ error: error instanceof Error ? error.message : 'Token validation failed'
192
+ };
193
+ }
194
+ }
195
+ /**
196
+ * Get RSA public key from cached JWKS (with 5+ hour caching)
197
+ */
198
+ async getPublicKeyFromCache(token) {
199
+ try {
200
+ // Extract kid from JWT header
201
+ const header = this.decodeJwtHeader(token);
202
+ if (!header.kid) {
203
+ throw new Error('Missing key ID in token header');
204
+ }
205
+ // Check Redis for cached JWKS
206
+ const redis = await redis_connection_1.default.getInstance();
207
+ const cachedJwks = await redis.sendCommand([
208
+ 'GET',
209
+ this.jwksCacheKey
210
+ ]);
211
+ let keyStore;
212
+ if (cachedJwks) {
213
+ this.logger.debug('Using cached JWKS');
214
+ const jwksData = JSON.parse(cachedJwks);
215
+ keyStore = await jose.JWK.asKeyStore(jwksData);
216
+ }
217
+ else {
218
+ this.logger.log('JWKS cache miss - fetching from Mercury');
219
+ keyStore = await this.fetchAndCacheJWKS();
220
+ }
221
+ // Get the specific key
222
+ const key = keyStore.get(header.kid);
223
+ if (!key) {
224
+ throw new Error(`Key ${header.kid} not found in JWKS`);
225
+ }
226
+ // Return PEM format public key
227
+ return key.toPEM(false);
228
+ }
229
+ catch (error) {
230
+ this.logger.error('Failed to get public key:', error.message);
231
+ throw new Error(`Failed to get public key: ${error.message}`);
232
+ }
233
+ }
234
+ /**
235
+ * Get current project secret version from Redis (cached by Mercury)
236
+ */
237
+ async getCurrentProjectSecretVersion(projectUuid) {
238
+ try {
239
+ const redis = await redis_connection_1.default.getInstance();
240
+ const cacheKey = `project_secret_version:${projectUuid}`;
241
+ const cachedVersion = await redis.sendCommand([
242
+ 'GET', cacheKey
243
+ ]);
244
+ if (cachedVersion) {
245
+ return parseInt(cachedVersion, 10);
246
+ }
247
+ // If not in Redis, this means Mercury hasn't cached it yet
248
+ // This shouldn't happen in normal flow, but fallback to allowing the token
249
+ // Mercury's Kafka handler will eventually populate this
250
+ return 0; // Default to allow if version not found
251
+ }
252
+ catch (error) {
253
+ throw new Error(`Failed to get project secret version: ${error.message}`);
254
+ }
255
+ }
256
+ /**
257
+ * Fetch JWKS from Mercury and cache in Redis
258
+ */
259
+ async fetchAndCacheJWKS() {
260
+ try {
261
+ const path = 'auth/project/.well-known/jwks.json';
262
+ const jwksUri = `${process.env.MERCURY_BASE_URL}/${path}`;
263
+ const timestamp = Date.now().toString();
264
+ const signatureInput = 'GET' + `/${path}` + timestamp;
265
+ const sharedSecret = process.env.SIGNATURE_SHARED_SECRET || '';
266
+ const signature = crypto
267
+ .createHmac('sha256', sharedSecret)
268
+ .update(signatureInput)
269
+ .digest('hex');
270
+ const headers = {
271
+ Accept: 'application/json',
272
+ 'User-Agent': 'Node-JWT-Strategy/1.0',
273
+ 'X-Timestamp': timestamp,
274
+ 'X-Signature': signature,
275
+ };
276
+ this.logger.log(`Fetching JWKS from: ${jwksUri}`);
277
+ const response = await axios_1.default.get(jwksUri, {
278
+ timeout: 10000,
279
+ headers,
280
+ });
281
+ if (!response.data || !response.data.keys) {
282
+ throw new Error('Invalid JWKS response');
283
+ }
284
+ // Cache JWKS in Redis for 5+ hours
285
+ const redis = await redis_connection_1.default.getInstance();
286
+ await redis.sendCommand([
287
+ 'SETEX',
288
+ this.jwksCacheKey,
289
+ this.jwksCacheTTL.toString(),
290
+ JSON.stringify(response.data)
291
+ ]);
292
+ this.logger.log(`JWKS cached successfully for ${this.jwksCacheTTL} seconds`);
293
+ // Create and return key store
294
+ return await jose.JWK.asKeyStore(response.data);
295
+ }
296
+ catch (error) {
297
+ this.logger.error('Failed to fetch JWKS:', error.message);
298
+ if (axios_1.default.isAxiosError(error)) {
299
+ if (error.code === 'ECONNREFUSED') {
300
+ throw new Error('Mercury service unavailable');
301
+ }
302
+ else if (error.code === 'ETIMEDOUT') {
303
+ throw new Error('Mercury service timeout');
304
+ }
305
+ else if (error.response) {
306
+ throw new Error(`Mercury returned ${error.response.status}: ${error.response.statusText}`);
307
+ }
308
+ }
309
+ throw new Error(`Failed to fetch JWKS: ${error.message}`);
310
+ }
311
+ }
312
+ /**
313
+ * Decode JWT header to extract kid
314
+ */
315
+ decodeJwtHeader(token) {
316
+ const parts = token.split('.');
317
+ if (parts.length !== 3) {
318
+ throw new Error('Invalid JWT format');
319
+ }
320
+ const headerJson = Buffer.from(parts[0], 'base64').toString();
321
+ return JSON.parse(headerJson);
322
+ }
323
+ /**
324
+ * Update JWKS cache TTL (can be increased beyond 5 hours)
325
+ */
326
+ setCacheTTL(seconds) {
327
+ this.jwksCacheTTL = seconds;
328
+ this.logger.log(`JWKS cache TTL updated to ${seconds} seconds`);
329
+ }
330
+ /**
331
+ * Manually refresh JWKS cache
332
+ */
333
+ async refreshJWKSCache() {
334
+ this.logger.log('Manually refreshing JWKS cache');
335
+ await this.fetchAndCacheJWKS();
336
+ }
337
+ /**
338
+ * Cleanup Redis connection (called on app shutdown)
339
+ */
340
+ async onApplicationShutdown() {
341
+ const redis = await redis_connection_1.default.getInstance();
342
+ if (redis) {
343
+ await redis.quit();
344
+ }
345
+ }
346
+ };
347
+ exports.ProjectAuthGuard = ProjectAuthGuard;
348
+ exports.ProjectAuthGuard = ProjectAuthGuard = ProjectAuthGuard_1 = __decorate([
349
+ (0, common_1.Injectable)(),
350
+ __metadata("design:paramtypes", [])
351
+ ], ProjectAuthGuard);
352
+ //# sourceMappingURL=project.guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.guard.js","sourceRoot":"","sources":["../../../src/nestjs/guards/project.guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { JwtAuthModule } from './jwt-auth.module';
2
+ export { JwtStrategy } from './strategies/jwt-strategy';
3
+ export { JwtAuthGuard } from './guards/jwt-guard';
4
+ export { ProjectAuthGuard } from './guards/project.guard';
5
+ export { ProjectAndUserAuth } from './decorators/auth.decorator';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nestjs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProjectAndUserAuth = exports.ProjectAuthGuard = exports.JwtAuthGuard = exports.JwtStrategy = exports.JwtAuthModule = void 0;
4
+ var jwt_auth_module_1 = require("./jwt-auth.module");
5
+ Object.defineProperty(exports, "JwtAuthModule", { enumerable: true, get: function () { return jwt_auth_module_1.JwtAuthModule; } });
6
+ var jwt_strategy_1 = require("./strategies/jwt-strategy");
7
+ Object.defineProperty(exports, "JwtStrategy", { enumerable: true, get: function () { return jwt_strategy_1.JwtStrategy; } });
8
+ var jwt_guard_1 = require("./guards/jwt-guard");
9
+ Object.defineProperty(exports, "JwtAuthGuard", { enumerable: true, get: function () { return jwt_guard_1.JwtAuthGuard; } });
10
+ var project_guard_1 = require("./guards/project.guard");
11
+ Object.defineProperty(exports, "ProjectAuthGuard", { enumerable: true, get: function () { return project_guard_1.ProjectAuthGuard; } });
12
+ var auth_decorator_1 = require("./decorators/auth.decorator");
13
+ Object.defineProperty(exports, "ProjectAndUserAuth", { enumerable: true, get: function () { return auth_decorator_1.ProjectAndUserAuth; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nestjs/index.ts"],"names":[],"mappings":";;;AAAA,qDAAkD;AAAzC,gHAAA,aAAa,OAAA;AACtB,0DAAwD;AAA/C,2GAAA,WAAW,OAAA;AACpB,gDAAkD;AAAzC,yGAAA,YAAY,OAAA;AACrB,wDAAyD;AAAhD,iHAAA,gBAAgB,OAAA;AACzB,8DAAiE;AAAxD,oHAAA,kBAAkB,OAAA"}
@@ -0,0 +1,3 @@
1
+ export declare class JwtAuthModule {
2
+ }
3
+ //# sourceMappingURL=jwt-auth.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-auth.module.d.ts","sourceRoot":"","sources":["../../src/nestjs/jwt-auth.module.ts"],"names":[],"mappings":"AAMA,qBAMa,aAAa;CAAG"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.JwtAuthModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const passport_1 = require("@nestjs/passport");
12
+ const jwt_guard_1 = require("./guards/jwt-guard");
13
+ const jwt_strategy_1 = require("./strategies/jwt-strategy");
14
+ let JwtAuthModule = class JwtAuthModule {
15
+ };
16
+ exports.JwtAuthModule = JwtAuthModule;
17
+ exports.JwtAuthModule = JwtAuthModule = __decorate([
18
+ (0, common_1.Global)(),
19
+ (0, common_1.Module)({
20
+ imports: [passport_1.PassportModule.register({ defaultStrategy: 'jwt' })],
21
+ providers: [jwt_strategy_1.JwtStrategy, jwt_guard_1.JwtAuthGuard],
22
+ exports: [jwt_guard_1.JwtAuthGuard, passport_1.PassportModule],
23
+ })
24
+ ], JwtAuthModule);
25
+ //# sourceMappingURL=jwt-auth.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-auth.module.js","sourceRoot":"","sources":["../../src/nestjs/jwt-auth.module.ts"],"names":[],"mappings":";;;;;;;;;AACA,2CAAgD;AAChD,+CAAkD;AAClD,kDAAkD;AAClD,4DAAwD;AAQjD,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IANzB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,yBAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9D,SAAS,EAAE,CAAC,0BAAW,EAAE,wBAAY,CAAC;QACtC,OAAO,EAAE,CAAC,wBAAY,EAAE,yBAAc,CAAC;KACxC,CAAC;GACW,aAAa,CAAG"}
@@ -0,0 +1,23 @@
1
+ import { Strategy } from 'passport-jwt';
2
+ import { Request } from 'express';
3
+ import { AuthUser, JwtPayload } from '../../types/jwt-payload';
4
+ import 'dotenv/config';
5
+ declare const JwtStrategy_base: new (...args: [opt: import("passport-jwt").StrategyOptionsWithRequest] | [opt: import("passport-jwt").StrategyOptionsWithoutRequest]) => Strategy & {
6
+ validate(...args: any[]): unknown;
7
+ };
8
+ export declare class JwtStrategy extends JwtStrategy_base {
9
+ private expectedIssuer;
10
+ private jwksCache;
11
+ constructor();
12
+ private decodeJWTTokenForProjectUuid;
13
+ private getJwksUriAndPath;
14
+ private fetchJWKS;
15
+ private getSigningKey;
16
+ private createTokenCacheKey;
17
+ private cacheValidatedToken;
18
+ private getCachedToken;
19
+ private extractRawTokenFromRequest;
20
+ validate(request: Request, payload: JwtPayload): Promise<AuthUser>;
21
+ }
22
+ export {};
23
+ //# sourceMappingURL=jwt-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-strategy.d.ts","sourceRoot":"","sources":["../../../src/nestjs/strategies/jwt-strategy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,eAAe,CAAC;;;;AAEvB,qBACa,WAAY,SAAQ,gBAA0B;IACzD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAGH;;IA6Bd,OAAO,CAAC,4BAA4B;IA4BpC,OAAO,CAAC,iBAAiB;YAsBX,SAAS;YA+ET,aAAa;IAwE3B,OAAO,CAAC,mBAAmB;YAYb,mBAAmB;YAwBnB,cAAc;IAwC5B,OAAO,CAAC,0BAA0B;IAiB5B,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC;CAwEzE"}