@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,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 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.test.d.ts","sourceRoot":"","sources":["../../src/test/middleware.test.ts"],"names":[],"mappings":""}
|