@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.
- package/README.md +986 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/middlewares/express.helper.d.ts +4 -0
- package/dist/middlewares/express.helper.d.ts.map +1 -0
- package/dist/middlewares/express.helper.js +31 -0
- package/dist/middlewares/express.helper.js.map +1 -0
- package/dist/middlewares/gql.helper.d.ts +14 -0
- package/dist/middlewares/gql.helper.d.ts.map +1 -0
- package/dist/middlewares/gql.helper.js +82 -0
- package/dist/middlewares/gql.helper.js.map +1 -0
- package/dist/middlewares/index.d.ts +5 -0
- package/dist/middlewares/index.d.ts.map +1 -0
- package/dist/middlewares/index.js +13 -0
- package/dist/middlewares/index.js.map +1 -0
- package/dist/middlewares/jwt.guard.d.ts +16 -0
- package/dist/middlewares/jwt.guard.d.ts.map +1 -0
- package/dist/middlewares/jwt.guard.js +336 -0
- package/dist/middlewares/jwt.guard.js.map +1 -0
- package/dist/middlewares/project.guard.d.ts +49 -0
- package/dist/middlewares/project.guard.d.ts.map +1 -0
- package/dist/middlewares/project.guard.js +310 -0
- package/dist/middlewares/project.guard.js.map +1 -0
- package/dist/nestjs/decorators/auth.decorator.d.ts +2 -0
- package/dist/nestjs/decorators/auth.decorator.d.ts.map +1 -0
- package/dist/nestjs/decorators/auth.decorator.js +10 -0
- package/dist/nestjs/decorators/auth.decorator.js.map +1 -0
- package/dist/nestjs/decorators/current-user.decorator.d.ts +2 -0
- package/dist/nestjs/decorators/current-user.decorator.d.ts.map +1 -0
- package/dist/nestjs/decorators/current-user.decorator.js +18 -0
- package/dist/nestjs/decorators/current-user.decorator.js.map +1 -0
- package/dist/nestjs/guards/jwt-guard.d.ts +8 -0
- package/dist/nestjs/guards/jwt-guard.d.ts.map +1 -0
- package/dist/nestjs/guards/jwt-guard.js +23 -0
- package/dist/nestjs/guards/jwt-guard.js.map +1 -0
- package/dist/nestjs/guards/project.guard.d.ts +45 -0
- package/dist/nestjs/guards/project.guard.d.ts.map +1 -0
- package/dist/nestjs/guards/project.guard.js +352 -0
- package/dist/nestjs/guards/project.guard.js.map +1 -0
- package/dist/nestjs/index.d.ts +6 -0
- package/dist/nestjs/index.d.ts.map +1 -0
- package/dist/nestjs/index.js +14 -0
- package/dist/nestjs/index.js.map +1 -0
- package/dist/nestjs/jwt-auth.module.d.ts +3 -0
- package/dist/nestjs/jwt-auth.module.d.ts.map +1 -0
- package/dist/nestjs/jwt-auth.module.js +25 -0
- package/dist/nestjs/jwt-auth.module.js.map +1 -0
- package/dist/nestjs/strategies/jwt-strategy.d.ts +23 -0
- package/dist/nestjs/strategies/jwt-strategy.d.ts.map +1 -0
- package/dist/nestjs/strategies/jwt-strategy.js +381 -0
- package/dist/nestjs/strategies/jwt-strategy.js.map +1 -0
- package/dist/test/middleware.test.d.ts +2 -0
- package/dist/test/middleware.test.d.ts.map +1 -0
- package/dist/test/middleware.test.js +383 -0
- package/dist/test/middleware.test.js.map +1 -0
- package/dist/types/jwt-payload.d.ts +48 -0
- package/dist/types/jwt-payload.d.ts.map +1 -0
- package/dist/types/jwt-payload.js +3 -0
- package/dist/types/jwt-payload.js.map +1 -0
- package/dist/utils/redis.connection.d.ts +9 -0
- package/dist/utils/redis.connection.d.ts.map +1 -0
- package/dist/utils/redis.connection.js +27 -0
- package/dist/utils/redis.connection.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Response, NextFunction } from 'express';
|
|
2
|
+
import { AuthenticatedRequest } from '../types/jwt-payload';
|
|
3
|
+
export declare class ProjectAuthMiddleware {
|
|
4
|
+
private jwksCacheKey;
|
|
5
|
+
private jwksCacheTTL;
|
|
6
|
+
constructor();
|
|
7
|
+
/**
|
|
8
|
+
* Main authentication middleware for project tokens
|
|
9
|
+
*/
|
|
10
|
+
authenticate(req: AuthenticatedRequest): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Validate project token using cached JWKS + RSA verification
|
|
13
|
+
*/
|
|
14
|
+
private validateProjectToken;
|
|
15
|
+
/**
|
|
16
|
+
* Get RSA public key from cached JWKS (with 5+ hour caching)
|
|
17
|
+
*/
|
|
18
|
+
private getPublicKeyFromCache;
|
|
19
|
+
/**
|
|
20
|
+
* Fetch JWKS from Mercury and cache in Redis
|
|
21
|
+
*/
|
|
22
|
+
private fetchAndCacheJWKS;
|
|
23
|
+
/**
|
|
24
|
+
* Decode JWT header to extract kid
|
|
25
|
+
*/
|
|
26
|
+
private decodeJwtHeader;
|
|
27
|
+
/**
|
|
28
|
+
* Get current project secret version from Redis (cached by Mercury)
|
|
29
|
+
*/
|
|
30
|
+
private getCurrentProjectSecretVersion;
|
|
31
|
+
/**
|
|
32
|
+
* Express middleware factory
|
|
33
|
+
*/
|
|
34
|
+
static middleware(): (req: AuthenticatedRequest, res: Response, next: NextFunction) => Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Update JWKS cache TTL (can be increased beyond 5 hours)
|
|
37
|
+
*/
|
|
38
|
+
setCacheTTL(seconds: number): void;
|
|
39
|
+
/**
|
|
40
|
+
* Manually refresh JWKS cache
|
|
41
|
+
*/
|
|
42
|
+
refreshJWKSCache(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Cleanup Redis connection
|
|
45
|
+
*/
|
|
46
|
+
cleanup(): Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
export default ProjectAuthMiddleware;
|
|
49
|
+
//# sourceMappingURL=project.guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.guard.d.ts","sourceRoot":"","sources":["../../src/middlewares/project.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAKjD,OAAO,EAAE,oBAAoB,EAAuB,MAAM,sBAAsB,CAAC;AAIjF,qBAAa,qBAAqB;IAChC,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,YAAY,CAAS;;IAI7B;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0D5D;;OAEG;YACW,oBAAoB;IAmElC;;OAEG;YACW,qBAAqB;IAwCnC;;OAEG;YACW,iBAAiB;IAuD/B;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;KAEC;YACa,8BAA8B;IAuB5C;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC;IAOpG;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAI/B;AAED,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,310 @@
|
|
|
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 __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.ProjectAuthMiddleware = void 0;
|
|
40
|
+
const jwt = __importStar(require("jsonwebtoken"));
|
|
41
|
+
const axios_1 = __importDefault(require("axios"));
|
|
42
|
+
const jose = __importStar(require("node-jose"));
|
|
43
|
+
const crypto = __importStar(require("crypto"));
|
|
44
|
+
const redis_connection_1 = __importDefault(require("../utils/redis.connection"));
|
|
45
|
+
// Redis-cached JWKS Project Authentication Middleware
|
|
46
|
+
class ProjectAuthMiddleware {
|
|
47
|
+
constructor() {
|
|
48
|
+
this.jwksCacheKey = 'project_jwks_cache';
|
|
49
|
+
this.jwksCacheTTL = 18000; // 5 hours in seconds
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Main authentication middleware for project tokens
|
|
53
|
+
*/
|
|
54
|
+
async authenticate(req) {
|
|
55
|
+
try {
|
|
56
|
+
// Extract token from x-project-token header
|
|
57
|
+
const authHeader = req.headers['x-project-token'];
|
|
58
|
+
if (!authHeader) {
|
|
59
|
+
throw new Error(`No project token provided, required_header: 'x-project-token'`);
|
|
60
|
+
}
|
|
61
|
+
// Handle Bearer prefix`
|
|
62
|
+
const token = authHeader.startsWith('Bearer ')
|
|
63
|
+
? authHeader.slice(7)
|
|
64
|
+
: authHeader;
|
|
65
|
+
if (!token) {
|
|
66
|
+
throw new Error('Empty project token');
|
|
67
|
+
}
|
|
68
|
+
// Validate project token using cached JWKS
|
|
69
|
+
const validation = await this.validateProjectToken(token);
|
|
70
|
+
if (!validation.isValid) {
|
|
71
|
+
throw new Error(`Invalid project token, message: ${validation.error}`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Check if current service is enabled for this project
|
|
75
|
+
const serviceId = process.env.SERVICE_ID;
|
|
76
|
+
if (!serviceId) {
|
|
77
|
+
throw new Error('Service ID not configured');
|
|
78
|
+
}
|
|
79
|
+
const hasAccess = validation.payload.enabled_services.includes(serviceId);
|
|
80
|
+
if (!hasAccess) {
|
|
81
|
+
throw new Error(`
|
|
82
|
+
error: Service access denied,
|
|
83
|
+
service_id: ${serviceId},
|
|
84
|
+
project: ${validation.payload.project_uuid},
|
|
85
|
+
enabled_services: ${validation.payload.enabled_services}
|
|
86
|
+
`);
|
|
87
|
+
}
|
|
88
|
+
// Inject project context into request (NO user context)
|
|
89
|
+
req.project = {
|
|
90
|
+
project_uuid: validation.payload.project_uuid,
|
|
91
|
+
enabled_services: validation.payload.enabled_services,
|
|
92
|
+
secret_version: validation.payload.secret_version,
|
|
93
|
+
token_id: validation.payload.token_id,
|
|
94
|
+
expires_at: validation.payload.exp
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
throw new Error(`Authentication service error ${error}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Validate project token using cached JWKS + RSA verification
|
|
103
|
+
*/
|
|
104
|
+
async validateProjectToken(token) {
|
|
105
|
+
try {
|
|
106
|
+
// Get public key from cached JWKS
|
|
107
|
+
const publicKey = await this.getPublicKeyFromCache(token);
|
|
108
|
+
// Verify JWT with RSA public key
|
|
109
|
+
const verified = jwt.verify(token, publicKey, {
|
|
110
|
+
algorithms: ["RS512"],
|
|
111
|
+
ignoreExpiration: false,
|
|
112
|
+
});
|
|
113
|
+
if (typeof verified !== 'object' || verified === null) {
|
|
114
|
+
return {
|
|
115
|
+
isValid: false,
|
|
116
|
+
error: 'Invalid token payload'
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const payload = verified;
|
|
120
|
+
// Validate project token structure
|
|
121
|
+
if (!payload.project_uuid || !payload.token_id || !Array.isArray(payload.enabled_services)) {
|
|
122
|
+
return {
|
|
123
|
+
isValid: false,
|
|
124
|
+
error: 'Invalid project token structure'
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const currentSecretVersion = await this.getCurrentProjectSecretVersion(payload.project_uuid);
|
|
128
|
+
if (currentSecretVersion > 0 && payload.secret_version < currentSecretVersion) {
|
|
129
|
+
return {
|
|
130
|
+
isValid: false,
|
|
131
|
+
error: `Token secret version outdated (token: ${payload.secret_version}, current: ${currentSecretVersion}) - re-authentication required`
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const redis = await redis_connection_1.default.getInstance();
|
|
135
|
+
// Check if token is in Redis cache (for revocation)
|
|
136
|
+
const tokenExists = await redis.sendCommand([
|
|
137
|
+
'EXISTS',
|
|
138
|
+
`project_token:${payload.token_id}`
|
|
139
|
+
]);
|
|
140
|
+
if (tokenExists === 0) {
|
|
141
|
+
return {
|
|
142
|
+
isValid: false,
|
|
143
|
+
error: 'Token has been revoked'
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
isValid: true,
|
|
148
|
+
payload
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
return {
|
|
153
|
+
isValid: false,
|
|
154
|
+
error: error instanceof Error ? error.message : 'Token validation failed'
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get RSA public key from cached JWKS (with 5+ hour caching)
|
|
160
|
+
*/
|
|
161
|
+
async getPublicKeyFromCache(token) {
|
|
162
|
+
try {
|
|
163
|
+
// Extract kid from JWT header
|
|
164
|
+
const header = this.decodeJwtHeader(token);
|
|
165
|
+
if (!header.kid) {
|
|
166
|
+
throw new Error('Missing key ID in token header');
|
|
167
|
+
}
|
|
168
|
+
// Check Redis for cached JWKS
|
|
169
|
+
const redis = await redis_connection_1.default.getInstance();
|
|
170
|
+
const cachedJwks = await redis.sendCommand([
|
|
171
|
+
'GET',
|
|
172
|
+
this.jwksCacheKey
|
|
173
|
+
]);
|
|
174
|
+
let keyStore;
|
|
175
|
+
if (cachedJwks) {
|
|
176
|
+
// Use cached JWKS
|
|
177
|
+
const jwksData = JSON.parse(cachedJwks);
|
|
178
|
+
keyStore = await jose.JWK.asKeyStore(jwksData);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
// Fetch fresh JWKS from Mercury and cache it
|
|
182
|
+
keyStore = await this.fetchAndCacheJWKS();
|
|
183
|
+
}
|
|
184
|
+
// Get the specific key
|
|
185
|
+
const key = keyStore.get(header.kid);
|
|
186
|
+
if (!key) {
|
|
187
|
+
throw new Error(`Key ${header.kid} not found in JWKS`);
|
|
188
|
+
}
|
|
189
|
+
// Return PEM format public key
|
|
190
|
+
const publicKey = key.toPEM(false);
|
|
191
|
+
return publicKey;
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
throw new Error(`Failed to get public key: ${error.message}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Fetch JWKS from Mercury and cache in Redis
|
|
199
|
+
*/
|
|
200
|
+
async fetchAndCacheJWKS() {
|
|
201
|
+
try {
|
|
202
|
+
const path = 'auth/project/.well-known/jwks.json';
|
|
203
|
+
const jwksUri = `${process.env.MERCURY_BASE_URL}/${path}`;
|
|
204
|
+
const timestamp = Date.now().toString();
|
|
205
|
+
const signatureInput = 'GET' + `/${path}` + timestamp;
|
|
206
|
+
const sharedSecret = process.env.SIGNATURE_SHARED_SECRET || '';
|
|
207
|
+
const signature = crypto
|
|
208
|
+
.createHmac('sha256', sharedSecret)
|
|
209
|
+
.update(signatureInput)
|
|
210
|
+
.digest('hex');
|
|
211
|
+
const headers = {
|
|
212
|
+
Accept: 'application/json',
|
|
213
|
+
'User-Agent': 'Node-JWT-Strategy/1.0',
|
|
214
|
+
'X-Timestamp': timestamp,
|
|
215
|
+
'X-Signature': signature,
|
|
216
|
+
};
|
|
217
|
+
const response = await axios_1.default.get(jwksUri, {
|
|
218
|
+
timeout: 10000,
|
|
219
|
+
headers,
|
|
220
|
+
});
|
|
221
|
+
if (!response.data || !response.data.keys) {
|
|
222
|
+
throw new Error('Invalid JWKS response');
|
|
223
|
+
}
|
|
224
|
+
// Cache JWKS in Redis for 5+ hours
|
|
225
|
+
const redis = await redis_connection_1.default.getInstance();
|
|
226
|
+
await redis.sendCommand([
|
|
227
|
+
'SETEX',
|
|
228
|
+
this.jwksCacheKey,
|
|
229
|
+
this.jwksCacheTTL.toString(),
|
|
230
|
+
JSON.stringify(response.data)
|
|
231
|
+
]);
|
|
232
|
+
// Create and return key store
|
|
233
|
+
return await jose.JWK.asKeyStore(response.data);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
237
|
+
const axiosError = error;
|
|
238
|
+
if (axiosError.code === 'ECONNREFUSED') {
|
|
239
|
+
throw new Error('Mercury service unavailable');
|
|
240
|
+
}
|
|
241
|
+
throw new Error(`HTTP ${axiosError.response?.status || 'unknown'}: ${axiosError.message}`);
|
|
242
|
+
}
|
|
243
|
+
throw new Error(`Failed to fetch JWKS: ${error.message}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Decode JWT header to extract kid
|
|
248
|
+
*/
|
|
249
|
+
decodeJwtHeader(token) {
|
|
250
|
+
const parts = token.split('.');
|
|
251
|
+
if (parts.length !== 3) {
|
|
252
|
+
throw new Error('Invalid JWT format');
|
|
253
|
+
}
|
|
254
|
+
const headerJson = Buffer.from(parts[0], 'base64').toString();
|
|
255
|
+
return JSON.parse(headerJson);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get current project secret version from Redis (cached by Mercury)
|
|
259
|
+
*/
|
|
260
|
+
async getCurrentProjectSecretVersion(projectUuid) {
|
|
261
|
+
try {
|
|
262
|
+
const redis = await redis_connection_1.default.getInstance();
|
|
263
|
+
const cacheKey = `project_secret_version:${projectUuid}`;
|
|
264
|
+
const cachedVersion = await redis.sendCommand([
|
|
265
|
+
'GET', cacheKey
|
|
266
|
+
]);
|
|
267
|
+
if (cachedVersion) {
|
|
268
|
+
return parseInt(cachedVersion, 10);
|
|
269
|
+
}
|
|
270
|
+
// If not in Redis, this means Mercury hasn't cached it yet
|
|
271
|
+
// This shouldn't happen in normal flow, but fallback to allowing the token
|
|
272
|
+
// Mercury's Kafka handler will eventually populate this
|
|
273
|
+
return 0; // Default to allow if version not found
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
throw new Error(`Failed to get project secret version: ${error.message}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Express middleware factory
|
|
281
|
+
*/
|
|
282
|
+
static middleware() {
|
|
283
|
+
const authMiddleware = new ProjectAuthMiddleware();
|
|
284
|
+
return (req) => {
|
|
285
|
+
return authMiddleware.authenticate(req);
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Update JWKS cache TTL (can be increased beyond 5 hours)
|
|
290
|
+
*/
|
|
291
|
+
setCacheTTL(seconds) {
|
|
292
|
+
this.jwksCacheTTL = seconds;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Manually refresh JWKS cache
|
|
296
|
+
*/
|
|
297
|
+
async refreshJWKSCache() {
|
|
298
|
+
await this.fetchAndCacheJWKS();
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Cleanup Redis connection
|
|
302
|
+
*/
|
|
303
|
+
async cleanup() {
|
|
304
|
+
const redis = await redis_connection_1.default.getInstance();
|
|
305
|
+
await redis.quit();
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
exports.ProjectAuthMiddleware = ProjectAuthMiddleware;
|
|
309
|
+
exports.default = ProjectAuthMiddleware;
|
|
310
|
+
//# sourceMappingURL=project.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.guard.js","sourceRoot":"","sources":["../../src/middlewares/project.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,kDAAoC;AACpC,kDAA0B;AAC1B,gDAAkC;AAClC,+CAAiC;AAEjC,iFAA+D;AAE/D,sDAAsD;AACtD,MAAa,qBAAqB;IAIhC;QAHQ,iBAAY,GAAG,oBAAoB,CAAC;QACpC,iBAAY,GAAG,KAAK,CAAC,CAAC,qBAAqB;IAEnC,CAAC;IAEjB;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,GAAyB;QAC1C,IAAI,CAAC;YACH,4CAA4C;YAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAW,CAAC;YAE5D,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;YACnF,CAAC;YAED,wBAAwB;YACxB,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC;gBAC5C,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrB,CAAC,CAAC,UAAU,CAAC;YAEf,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACzC,CAAC;YAED,2CAA2C;YAC3C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAE1D,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,mCAAmC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;gBAEvE,OAAO;YACT,CAAC;YAED,uDAAuD;YACvD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;YACzC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,SAAS,GAAG,UAAU,CAAC,OAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC3E,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC;;wBAEA,SAAS;qBACZ,UAAU,CAAC,OAAQ,CAAC,YAAY;8BACvB,UAAU,CAAC,OAAQ,CAAC,gBAAgB;SACzD,CAAC,CAAC;YACL,CAAC;YAED,wDAAwD;YACxD,GAAG,CAAC,OAAO,GAAG;gBACZ,YAAY,EAAE,UAAU,CAAC,OAAQ,CAAC,YAAY;gBAC9C,gBAAgB,EAAE,UAAU,CAAC,OAAQ,CAAC,gBAAgB;gBACtD,cAAc,EAAE,UAAU,CAAC,OAAQ,CAAC,cAAc;gBAClD,QAAQ,EAAE,UAAU,CAAC,OAAQ,CAAC,QAAQ;gBACtC,UAAU,EAAE,UAAU,CAAC,OAAQ,CAAC,GAAG;aACpC,CAAC;QAGJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB,CAAC,KAAa;QAK9C,IAAI,CAAC;YACH,kCAAkC;YAClC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAE1D,iCAAiC;YACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE;gBAC5C,UAAU,EAAE,CAAC,OAAO,CAAC;gBACrB,gBAAgB,EAAE,KAAK;aACxB,CAAC,CAAC;YAEH,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,uBAAuB;iBAC/B,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,QAA+B,CAAC;YAEhD,mCAAmC;YACnC,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC3F,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,iCAAiC;iBACzC,CAAC;YACJ,CAAC;YAED,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,8BAA8B,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC7F,IAAI,oBAAoB,GAAG,CAAC,IAAI,OAAO,CAAC,cAAc,GAAG,oBAAoB,EAAE,CAAC;gBAC9E,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,yCAAyC,OAAO,CAAC,cAAc,cAAc,oBAAoB,gCAAgC;iBACzI,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,0BAAsB,CAAC,WAAW,EAAE,CAAC;YACzD,oDAAoD;YACpD,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;gBAC1C,QAAQ;gBACR,iBAAiB,OAAO,CAAC,QAAQ,EAAE;aACpC,CAAW,CAAC;YAEb,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,wBAAwB;iBAChC,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO;aACR,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB;aAC1E,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,qBAAqB,CAAC,KAAa;QAC/C,IAAI,CAAC;YACH,8BAA8B;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACpD,CAAC;YAED,8BAA8B;YAC9B,MAAM,KAAK,GAAG,MAAM,0BAAsB,CAAC,WAAW,EAAE,CAAC;YACzD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;gBACzC,KAAK;gBACL,IAAI,CAAC,YAAY;aAClB,CAAkB,CAAC;YAEpB,IAAI,QAA2B,CAAC;YAEhC,IAAI,UAAU,EAAE,CAAC;gBACf,kBAAkB;gBAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACxC,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,6CAA6C;gBAC7C,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5C,CAAC;YAED,uBAAuB;YACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAA6B,CAAC;YACjE,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,OAAO,MAAM,CAAC,GAAG,oBAAoB,CAAC,CAAC;YACzD,CAAC;YAED,+BAA+B;YAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnC,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,oCAAoC,CAAA;YACjD,MAAM,OAAO,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,EAAE,CAAC;YAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,cAAc,GAAG,KAAK,GAAG,IAAI,IAAI,EAAE,GAAG,SAAS,CAAC;YACtD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE,CAAC;YAE/D,MAAM,SAAS,GAAG,MAAM;iBACrB,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC;iBAClC,MAAM,CAAC,cAAc,CAAC;iBACtB,MAAM,CAAC,KAAK,CAAC,CAAC;YAEjB,MAAM,OAAO,GAAG;gBACd,MAAM,EAAE,kBAAkB;gBAC1B,YAAY,EAAE,uBAAuB;gBACrC,aAAa,EAAE,SAAS;gBACxB,aAAa,EAAE,SAAS;aACzB,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAA0C,OAAO,EAAE;gBACjF,OAAO,EAAE,KAAK;gBACd,OAAO;aACR,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAED,mCAAmC;YACnC,MAAM,KAAK,GAAG,MAAM,0BAAsB,CAAC,WAAW,EAAE,CAAC;YACzD,MAAM,KAAK,CAAC,WAAW,CAAC;gBACtB,OAAO;gBACP,IAAI,CAAC,YAAY;gBACjB,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;gBAC5B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;aAC9B,CAAC,CAAC;YAEH,8BAA8B;YAC9B,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAElD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,MAAM,UAAU,GAAG,KAAK,CAAC;gBACzB,IAAI,UAAU,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBACvC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBACjD,CAAC;gBAED,MAAM,IAAI,KAAK,CAAC,QAAQ,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,SAAS,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7F,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,KAAa;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAED;;KAEC;IACO,KAAK,CAAC,8BAA8B,CAAC,WAAmB;QAC9D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,0BAAsB,CAAC,WAAW,EAAE,CAAC;YACzD,MAAM,QAAQ,GAAG,0BAA0B,WAAW,EAAE,CAAC;YAEzD,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;gBAC5C,KAAK,EAAE,QAAQ;aAChB,CAAkB,CAAC;YAEpB,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACrC,CAAC;YAED,2DAA2D;YAC3D,2EAA2E;YAC3E,wDAAwD;YACxD,OAAO,CAAC,CAAC,CAAC,wCAAwC;QAEpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU;QACf,MAAM,cAAc,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACnD,OAAO,CAAC,GAAyB,EAAE,EAAE;YACnC,OAAO,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAAe;QACzB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB;QACpB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,KAAK,GAAG,MAAM,0BAAsB,CAAC,WAAW,EAAE,CAAC;QACzD,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;CACF;AApTD,sDAoTC;AAED,kBAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.decorator.d.ts","sourceRoot":"","sources":["../../../src/nestjs/decorators/auth.decorator.ts"],"names":[],"mappings":"AAIA,wBAAgB,kBAAkB,gJAEjC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProjectAndUserAuth = ProjectAndUserAuth;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const project_guard_1 = require("../guards/project.guard");
|
|
6
|
+
const jwt_guard_1 = require("../guards/jwt-guard");
|
|
7
|
+
function ProjectAndUserAuth() {
|
|
8
|
+
return (0, common_1.applyDecorators)((0, common_1.UseGuards)(jwt_guard_1.JwtAuthGuard, project_guard_1.ProjectAuthGuard));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=auth.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.decorator.js","sourceRoot":"","sources":["../../../src/nestjs/decorators/auth.decorator.ts"],"names":[],"mappings":";;AAIA,gDAEC;AAND,2CAA4D;AAC5D,2DAA2D;AAC3D,mDAAmD;AAEnD,SAAgB,kBAAkB;IAChC,OAAO,IAAA,wBAAe,EAAC,IAAA,kBAAS,EAAC,wBAAY,EAAE,gCAAgB,CAAC,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"current-user.decorator.d.ts","sourceRoot":"","sources":["../../../src/nestjs/decorators/current-user.decorator.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,yLAiBvB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CurrentUser = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const graphql_1 = require("@nestjs/graphql");
|
|
6
|
+
exports.CurrentUser = (0, common_1.createParamDecorator)((data, context) => {
|
|
7
|
+
const ctx = graphql_1.GqlExecutionContext.create(context);
|
|
8
|
+
const request = ctx.getContext().req;
|
|
9
|
+
const user = request.user;
|
|
10
|
+
if (!user) {
|
|
11
|
+
throw new Error('User not found in request context');
|
|
12
|
+
}
|
|
13
|
+
if (data) {
|
|
14
|
+
return user[data];
|
|
15
|
+
}
|
|
16
|
+
return user;
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=current-user.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"current-user.decorator.js","sourceRoot":"","sources":["../../../src/nestjs/decorators/current-user.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwE;AACxE,6CAAsD;AAEzC,QAAA,WAAW,GAAG,IAAA,6BAAoB,EAC7C,CAAC,IAAwB,EAAE,OAAyB,EAAU,EAAE;IAC9D,MAAM,GAAG,GAAG,6BAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC;IAErC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import { Request } from 'express';
|
|
3
|
+
declare const JwtAuthGuard_base: import("@nestjs/passport").Type<import("@nestjs/passport").IAuthGuard>;
|
|
4
|
+
export declare class JwtAuthGuard extends JwtAuthGuard_base {
|
|
5
|
+
getRequest(context: ExecutionContext): Request;
|
|
6
|
+
}
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=jwt-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-guard.d.ts","sourceRoot":"","sources":["../../../src/nestjs/guards/jwt-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;;AAIlC,qBACa,YAAa,SAAQ,iBAAgB;IAChD,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;CAI/C"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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.JwtAuthGuard = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const passport_1 = require("@nestjs/passport");
|
|
12
|
+
const graphql_1 = require("@nestjs/graphql");
|
|
13
|
+
let JwtAuthGuard = class JwtAuthGuard extends (0, passport_1.AuthGuard)('jwt') {
|
|
14
|
+
getRequest(context) {
|
|
15
|
+
const ctx = graphql_1.GqlExecutionContext.create(context);
|
|
16
|
+
return ctx.getContext().req;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
exports.JwtAuthGuard = JwtAuthGuard;
|
|
20
|
+
exports.JwtAuthGuard = JwtAuthGuard = __decorate([
|
|
21
|
+
(0, common_1.Injectable)()
|
|
22
|
+
], JwtAuthGuard);
|
|
23
|
+
//# sourceMappingURL=jwt-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-guard.js","sourceRoot":"","sources":["../../../src/nestjs/guards/jwt-guard.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA8D;AAC9D,+CAA6C;AAE7C,6CAAsD;AAI/C,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,IAAA,oBAAS,EAAC,KAAK,CAAC;IAChD,UAAU,CAAC,OAAyB;QAClC,MAAM,GAAG,GAAG,6BAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC,UAAU,EAAc,CAAC,GAAG,CAAC;IAC1C,CAAC;CACF,CAAA;AALY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;GACA,YAAY,CAKxB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
|
+
export declare class ProjectAuthGuard implements CanActivate {
|
|
3
|
+
private readonly logger;
|
|
4
|
+
private jwksCacheKey;
|
|
5
|
+
private jwksCacheTTL;
|
|
6
|
+
constructor();
|
|
7
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
8
|
+
/**
|
|
9
|
+
* Extract request object from different NestJS contexts
|
|
10
|
+
*/
|
|
11
|
+
private getRequest;
|
|
12
|
+
/**
|
|
13
|
+
* Validate project token using cached JWKS + RSA verification
|
|
14
|
+
*/
|
|
15
|
+
private validateProjectToken;
|
|
16
|
+
/**
|
|
17
|
+
* Get RSA public key from cached JWKS (with 5+ hour caching)
|
|
18
|
+
*/
|
|
19
|
+
private getPublicKeyFromCache;
|
|
20
|
+
/**
|
|
21
|
+
* Get current project secret version from Redis (cached by Mercury)
|
|
22
|
+
*/
|
|
23
|
+
private getCurrentProjectSecretVersion;
|
|
24
|
+
/**
|
|
25
|
+
* Fetch JWKS from Mercury and cache in Redis
|
|
26
|
+
*/
|
|
27
|
+
private fetchAndCacheJWKS;
|
|
28
|
+
/**
|
|
29
|
+
* Decode JWT header to extract kid
|
|
30
|
+
*/
|
|
31
|
+
private decodeJwtHeader;
|
|
32
|
+
/**
|
|
33
|
+
* Update JWKS cache TTL (can be increased beyond 5 hours)
|
|
34
|
+
*/
|
|
35
|
+
setCacheTTL(seconds: number): void;
|
|
36
|
+
/**
|
|
37
|
+
* Manually refresh JWKS cache
|
|
38
|
+
*/
|
|
39
|
+
refreshJWKSCache(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Cleanup Redis connection (called on app shutdown)
|
|
42
|
+
*/
|
|
43
|
+
onApplicationShutdown(): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=project.guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.guard.d.ts","sourceRoot":"","sources":["../../../src/nestjs/guards/project.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,gBAAgB,EAGjB,MAAM,gBAAgB,CAAC;AAQxB,qBACa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,YAAY,CAAS;;IAIvB,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAiF9D;;OAEG;IACH,OAAO,CAAC,UAAU;IAalB;;OAEG;YACW,oBAAoB;IAoElC;;OAEG;YACW,qBAAqB;IAyCnC;;KAEC;YACa,8BAA8B;IAuB5C;;OAEG;YACW,iBAAiB;IA8D/B;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKlC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAKvC;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7C"}
|