@rapidraptor/auth-server 0.2.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/dist/config.d.ts +33 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +44 -0
- package/dist/config.js.map +1 -0
- package/dist/firebase/admin.d.ts +18 -0
- package/dist/firebase/admin.d.ts.map +1 -0
- package/dist/firebase/admin.js +96 -0
- package/dist/firebase/admin.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/authMiddleware.d.ts +9 -0
- package/dist/middleware/authMiddleware.d.ts.map +1 -0
- package/dist/middleware/authMiddleware.js +241 -0
- package/dist/middleware/authMiddleware.js.map +1 -0
- package/dist/middleware/authMiddleware.test.d.ts +2 -0
- package/dist/middleware/authMiddleware.test.d.ts.map +1 -0
- package/dist/middleware/authMiddleware.test.js +691 -0
- package/dist/middleware/authMiddleware.test.js.map +1 -0
- package/dist/middleware/logoutHandler.d.ts +9 -0
- package/dist/middleware/logoutHandler.d.ts.map +1 -0
- package/dist/middleware/logoutHandler.js +54 -0
- package/dist/middleware/logoutHandler.js.map +1 -0
- package/dist/middleware/logoutHandler.test.d.ts +2 -0
- package/dist/middleware/logoutHandler.test.d.ts.map +1 -0
- package/dist/middleware/logoutHandler.test.js +103 -0
- package/dist/middleware/logoutHandler.test.js.map +1 -0
- package/dist/session/firestoreSync.d.ts +37 -0
- package/dist/session/firestoreSync.d.ts.map +1 -0
- package/dist/session/firestoreSync.js +88 -0
- package/dist/session/firestoreSync.js.map +1 -0
- package/dist/session/firestoreSync.test.d.ts +2 -0
- package/dist/session/firestoreSync.test.d.ts.map +1 -0
- package/dist/session/firestoreSync.test.js +142 -0
- package/dist/session/firestoreSync.test.js.map +1 -0
- package/dist/session/sessionCache.d.ts +37 -0
- package/dist/session/sessionCache.d.ts.map +1 -0
- package/dist/session/sessionCache.js +63 -0
- package/dist/session/sessionCache.js.map +1 -0
- package/dist/session/sessionCache.test.d.ts +2 -0
- package/dist/session/sessionCache.test.d.ts.map +1 -0
- package/dist/session/sessionCache.test.js +117 -0
- package/dist/session/sessionCache.test.js.map +1 -0
- package/dist/session/sessionService.d.ts +97 -0
- package/dist/session/sessionService.d.ts.map +1 -0
- package/dist/session/sessionService.js +311 -0
- package/dist/session/sessionService.js.map +1 -0
- package/dist/session/sessionService.test.d.ts +2 -0
- package/dist/session/sessionService.test.d.ts.map +1 -0
- package/dist/session/sessionService.test.js +426 -0
- package/dist/session/sessionService.test.js.map +1 -0
- package/dist/session/types.d.ts +7 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +2 -0
- package/dist/session/types.js.map +1 -0
- package/dist/tokenVerifier/errors.d.ts +23 -0
- package/dist/tokenVerifier/errors.d.ts.map +1 -0
- package/dist/tokenVerifier/errors.js +34 -0
- package/dist/tokenVerifier/errors.js.map +1 -0
- package/dist/tokenVerifier/joseTokenVerifier.d.ts +24 -0
- package/dist/tokenVerifier/joseTokenVerifier.d.ts.map +1 -0
- package/dist/tokenVerifier/joseTokenVerifier.js +157 -0
- package/dist/tokenVerifier/joseTokenVerifier.js.map +1 -0
- package/dist/tokenVerifier/types.d.ts +41 -0
- package/dist/tokenVerifier/types.d.ts.map +1 -0
- package/dist/tokenVerifier/types.js +2 -0
- package/dist/tokenVerifier/types.js.map +1 -0
- package/dist/types/middleware.d.ts +33 -0
- package/dist/types/middleware.d.ts.map +1 -0
- package/dist/types/middleware.js +2 -0
- package/dist/types/middleware.js.map +1 -0
- package/dist/types/session.d.ts +7 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +2 -0
- package/dist/types/session.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { SessionService, TokenRevokedError } from './sessionService.js';
|
|
3
|
+
import { SessionCache } from './sessionCache.js';
|
|
4
|
+
import { FirestoreSync } from './firestoreSync.js';
|
|
5
|
+
import { SessionValidationStatus } from '@rapidraptor/auth-shared';
|
|
6
|
+
describe('SessionService', () => {
|
|
7
|
+
let sessionService;
|
|
8
|
+
let cache;
|
|
9
|
+
let firestoreSync;
|
|
10
|
+
let mockFirestore;
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
let mockCollection;
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
+
let mockDoc;
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
16
|
+
let mockLogoutsCollection;
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
|
+
let mockLogoutDoc;
|
|
19
|
+
const inactivityTimeout = 24 * 60 * 60 * 1000; // 24 hours
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
cache = new SessionCache(inactivityTimeout);
|
|
22
|
+
// Create a proper mock Firestore with batch method
|
|
23
|
+
const mockBatch = {
|
|
24
|
+
set: vi.fn(),
|
|
25
|
+
commit: vi.fn().mockResolvedValue(undefined),
|
|
26
|
+
};
|
|
27
|
+
const mockFirestoreWithBatch = {
|
|
28
|
+
collection: vi.fn(),
|
|
29
|
+
batch: vi.fn(() => mockBatch),
|
|
30
|
+
};
|
|
31
|
+
firestoreSync = new FirestoreSync(mockFirestoreWithBatch, 5 * 60 * 1000, 'user_sessions');
|
|
32
|
+
mockDoc = {
|
|
33
|
+
get: vi.fn(),
|
|
34
|
+
set: vi.fn(),
|
|
35
|
+
delete: vi.fn(),
|
|
36
|
+
};
|
|
37
|
+
mockCollection = {
|
|
38
|
+
doc: vi.fn(() => mockDoc),
|
|
39
|
+
where: vi.fn(() => ({
|
|
40
|
+
get: vi.fn(),
|
|
41
|
+
})),
|
|
42
|
+
};
|
|
43
|
+
mockLogoutDoc = {
|
|
44
|
+
get: vi.fn(),
|
|
45
|
+
set: vi.fn(),
|
|
46
|
+
};
|
|
47
|
+
mockLogoutsCollection = {
|
|
48
|
+
doc: vi.fn(() => mockLogoutDoc),
|
|
49
|
+
};
|
|
50
|
+
mockFirestore = {
|
|
51
|
+
collection: vi.fn((collectionName) => {
|
|
52
|
+
if (collectionName === 'user_logouts') {
|
|
53
|
+
return mockLogoutsCollection;
|
|
54
|
+
}
|
|
55
|
+
return mockCollection;
|
|
56
|
+
}),
|
|
57
|
+
runTransaction: vi.fn(),
|
|
58
|
+
};
|
|
59
|
+
sessionService = new SessionService(cache, firestoreSync, mockFirestore, inactivityTimeout);
|
|
60
|
+
});
|
|
61
|
+
describe('validateSession', () => {
|
|
62
|
+
it('should return VALID for valid cached session', async () => {
|
|
63
|
+
const session = {
|
|
64
|
+
userId: 'user1',
|
|
65
|
+
createdAt: new Date(),
|
|
66
|
+
lastActivityAt: new Date(),
|
|
67
|
+
expiresAt: new Date(Date.now() + inactivityTimeout),
|
|
68
|
+
};
|
|
69
|
+
cache.set('user1', session);
|
|
70
|
+
const status = await sessionService.validateSession('user1');
|
|
71
|
+
expect(status).toBe(SessionValidationStatus.VALID);
|
|
72
|
+
expect(mockFirestore.collection).not.toHaveBeenCalled();
|
|
73
|
+
});
|
|
74
|
+
it('should return EXPIRED for expired cached session and check Firestore', async () => {
|
|
75
|
+
const expiredSession = {
|
|
76
|
+
userId: 'user1',
|
|
77
|
+
createdAt: new Date(Date.now() - inactivityTimeout),
|
|
78
|
+
lastActivityAt: new Date(Date.now() - inactivityTimeout),
|
|
79
|
+
expiresAt: new Date(Date.now() - 1000),
|
|
80
|
+
};
|
|
81
|
+
cache.set('user1', expiredSession);
|
|
82
|
+
mockDoc.get.mockResolvedValue({
|
|
83
|
+
exists: true,
|
|
84
|
+
data: () => ({
|
|
85
|
+
userId: 'user1',
|
|
86
|
+
createdAt: { toDate: () => expiredSession.createdAt },
|
|
87
|
+
lastActivityAt: { toDate: () => expiredSession.lastActivityAt },
|
|
88
|
+
expiresAt: { toDate: () => expiredSession.expiresAt },
|
|
89
|
+
}),
|
|
90
|
+
});
|
|
91
|
+
const status = await sessionService.validateSession('user1');
|
|
92
|
+
expect(status).toBe(SessionValidationStatus.EXPIRED);
|
|
93
|
+
});
|
|
94
|
+
it('should return NOT_FOUND when Firestore document does not exist', async () => {
|
|
95
|
+
mockDoc.get.mockResolvedValue({
|
|
96
|
+
exists: false,
|
|
97
|
+
});
|
|
98
|
+
const status = await sessionService.validateSession('user1');
|
|
99
|
+
expect(status).toBe(SessionValidationStatus.NOT_FOUND);
|
|
100
|
+
});
|
|
101
|
+
it('should return VALID when Firestore document exists and is not expired', async () => {
|
|
102
|
+
const now = new Date();
|
|
103
|
+
const expiresAt = new Date(now.getTime() + inactivityTimeout);
|
|
104
|
+
const firestoreTimestamp = {
|
|
105
|
+
toDate: () => now,
|
|
106
|
+
};
|
|
107
|
+
mockDoc.get.mockResolvedValue({
|
|
108
|
+
exists: true,
|
|
109
|
+
data: () => ({
|
|
110
|
+
userId: 'user1',
|
|
111
|
+
createdAt: firestoreTimestamp,
|
|
112
|
+
lastActivityAt: firestoreTimestamp,
|
|
113
|
+
expiresAt: { toDate: () => expiresAt },
|
|
114
|
+
}),
|
|
115
|
+
});
|
|
116
|
+
const status = await sessionService.validateSession('user1');
|
|
117
|
+
expect(status).toBe(SessionValidationStatus.VALID);
|
|
118
|
+
expect(cache.get('user1')).toBeTruthy();
|
|
119
|
+
});
|
|
120
|
+
it('should return EXPIRED when Firestore document exists but is expired', async () => {
|
|
121
|
+
const now = new Date();
|
|
122
|
+
const expiredTime = new Date(now.getTime() - 1000);
|
|
123
|
+
const firestoreTimestamp = {
|
|
124
|
+
toDate: () => expiredTime,
|
|
125
|
+
};
|
|
126
|
+
mockDoc.get.mockResolvedValue({
|
|
127
|
+
exists: true,
|
|
128
|
+
data: () => ({
|
|
129
|
+
userId: 'user1',
|
|
130
|
+
createdAt: firestoreTimestamp,
|
|
131
|
+
lastActivityAt: firestoreTimestamp,
|
|
132
|
+
expiresAt: { toDate: () => expiredTime },
|
|
133
|
+
}),
|
|
134
|
+
});
|
|
135
|
+
const status = await sessionService.validateSession('user1');
|
|
136
|
+
expect(status).toBe(SessionValidationStatus.EXPIRED);
|
|
137
|
+
});
|
|
138
|
+
it('should return DATA_INTEGRITY_ERROR when cached session userId mismatch', async () => {
|
|
139
|
+
const session = {
|
|
140
|
+
userId: 'user2', // Mismatch
|
|
141
|
+
createdAt: new Date(),
|
|
142
|
+
lastActivityAt: new Date(),
|
|
143
|
+
expiresAt: new Date(Date.now() + inactivityTimeout),
|
|
144
|
+
};
|
|
145
|
+
cache.set('user1', session);
|
|
146
|
+
const status = await sessionService.validateSession('user1');
|
|
147
|
+
expect(status).toBe(SessionValidationStatus.DATA_INTEGRITY_ERROR);
|
|
148
|
+
expect(cache.get('user1')).toBeNull(); // Should be cleared
|
|
149
|
+
});
|
|
150
|
+
it('should return DATA_INTEGRITY_ERROR when Firestore document userId mismatch', async () => {
|
|
151
|
+
const now = new Date();
|
|
152
|
+
const expiresAt = new Date(now.getTime() + inactivityTimeout);
|
|
153
|
+
const firestoreTimestamp = {
|
|
154
|
+
toDate: () => now,
|
|
155
|
+
};
|
|
156
|
+
mockDoc.get.mockResolvedValue({
|
|
157
|
+
exists: true,
|
|
158
|
+
data: () => ({
|
|
159
|
+
userId: 'user2', // Mismatch with document ID
|
|
160
|
+
createdAt: firestoreTimestamp,
|
|
161
|
+
lastActivityAt: firestoreTimestamp,
|
|
162
|
+
expiresAt: { toDate: () => expiresAt },
|
|
163
|
+
}),
|
|
164
|
+
});
|
|
165
|
+
const status = await sessionService.validateSession('user1');
|
|
166
|
+
expect(status).toBe(SessionValidationStatus.DATA_INTEGRITY_ERROR);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
describe('isSessionValid', () => {
|
|
170
|
+
it('should return true for valid session', async () => {
|
|
171
|
+
const session = {
|
|
172
|
+
userId: 'user1',
|
|
173
|
+
createdAt: new Date(),
|
|
174
|
+
lastActivityAt: new Date(),
|
|
175
|
+
expiresAt: new Date(Date.now() + inactivityTimeout),
|
|
176
|
+
};
|
|
177
|
+
cache.set('user1', session);
|
|
178
|
+
const isValid = await sessionService.isSessionValid('user1');
|
|
179
|
+
expect(isValid).toBe(true);
|
|
180
|
+
});
|
|
181
|
+
it('should return false for invalid session', async () => {
|
|
182
|
+
mockDoc.get.mockResolvedValue({
|
|
183
|
+
exists: false,
|
|
184
|
+
});
|
|
185
|
+
const isValid = await sessionService.isSessionValid('user1');
|
|
186
|
+
expect(isValid).toBe(false);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe('ensureSession', () => {
|
|
190
|
+
it('should create new session if it does not exist', async () => {
|
|
191
|
+
// Mock Firestore to return no document (session doesn't exist)
|
|
192
|
+
mockDoc.get.mockResolvedValue({
|
|
193
|
+
exists: false,
|
|
194
|
+
});
|
|
195
|
+
const wasCreated = await sessionService.ensureSession('user1');
|
|
196
|
+
expect(wasCreated).toBe(true);
|
|
197
|
+
expect(cache.get('user1')).toBeTruthy();
|
|
198
|
+
expect(mockDoc.set).toHaveBeenCalled();
|
|
199
|
+
});
|
|
200
|
+
it('should return false if session already exists and is valid', async () => {
|
|
201
|
+
const session = {
|
|
202
|
+
userId: 'user1',
|
|
203
|
+
createdAt: new Date(),
|
|
204
|
+
lastActivityAt: new Date(),
|
|
205
|
+
expiresAt: new Date(Date.now() + inactivityTimeout),
|
|
206
|
+
};
|
|
207
|
+
// Set valid session in cache
|
|
208
|
+
cache.set('user1', session);
|
|
209
|
+
const wasCreated = await sessionService.ensureSession('user1');
|
|
210
|
+
expect(wasCreated).toBe(false);
|
|
211
|
+
expect(mockDoc.set).not.toHaveBeenCalled();
|
|
212
|
+
});
|
|
213
|
+
it('should throw error if session exists but is expired', async () => {
|
|
214
|
+
const expiredSession = {
|
|
215
|
+
userId: 'user1',
|
|
216
|
+
createdAt: new Date(Date.now() - inactivityTimeout),
|
|
217
|
+
lastActivityAt: new Date(Date.now() - inactivityTimeout),
|
|
218
|
+
expiresAt: new Date(Date.now() - 1000),
|
|
219
|
+
};
|
|
220
|
+
// Set expired session in cache
|
|
221
|
+
cache.set('user1', expiredSession);
|
|
222
|
+
// Mock Firestore to return expired session
|
|
223
|
+
mockDoc.get.mockResolvedValue({
|
|
224
|
+
exists: true,
|
|
225
|
+
data: () => ({
|
|
226
|
+
userId: 'user1',
|
|
227
|
+
createdAt: { toDate: () => expiredSession.createdAt },
|
|
228
|
+
lastActivityAt: { toDate: () => expiredSession.lastActivityAt },
|
|
229
|
+
expiresAt: { toDate: () => expiredSession.expiresAt },
|
|
230
|
+
}),
|
|
231
|
+
});
|
|
232
|
+
await expect(sessionService.ensureSession('user1')).rejects.toThrow('Session has expired. Please logout and login again.');
|
|
233
|
+
// Verify session was NOT recreated
|
|
234
|
+
expect(mockDoc.set).not.toHaveBeenCalled();
|
|
235
|
+
});
|
|
236
|
+
it('should recreate session if data integrity issue detected (userId mismatch)', async () => {
|
|
237
|
+
// Mock Firestore to return document with mismatched userId
|
|
238
|
+
mockDoc.get.mockResolvedValue({
|
|
239
|
+
exists: true,
|
|
240
|
+
data: () => ({
|
|
241
|
+
userId: 'different-user', // Mismatch with document ID
|
|
242
|
+
createdAt: { toDate: () => new Date() },
|
|
243
|
+
lastActivityAt: { toDate: () => new Date() },
|
|
244
|
+
expiresAt: { toDate: () => new Date(Date.now() + inactivityTimeout) },
|
|
245
|
+
}),
|
|
246
|
+
});
|
|
247
|
+
const wasCreated = await sessionService.ensureSession('user1');
|
|
248
|
+
expect(wasCreated).toBe(true);
|
|
249
|
+
expect(cache.get('user1')).toBeTruthy();
|
|
250
|
+
// Verify new session was created with correct userId
|
|
251
|
+
const newSession = cache.get('user1');
|
|
252
|
+
expect(newSession.userId).toBe('user1');
|
|
253
|
+
expect(mockDoc.set).toHaveBeenCalled();
|
|
254
|
+
});
|
|
255
|
+
it('should throw error if token was issued before logout', async () => {
|
|
256
|
+
// Mock logout record exists
|
|
257
|
+
const loggedOutAt = new Date();
|
|
258
|
+
const tokenIssuedAt = new Date(loggedOutAt.getTime() - 1000); // 1 second before logout
|
|
259
|
+
mockLogoutDoc.get.mockResolvedValue({
|
|
260
|
+
exists: true,
|
|
261
|
+
data: () => ({
|
|
262
|
+
userId: 'user1',
|
|
263
|
+
loggedOutAt: { toDate: () => loggedOutAt },
|
|
264
|
+
expiresAt: { toDate: () => new Date(loggedOutAt.getTime() + 3600000) }, // 1 hour TTL, still valid
|
|
265
|
+
}),
|
|
266
|
+
});
|
|
267
|
+
// Mock Firestore to return no document (session doesn't exist)
|
|
268
|
+
mockDoc.get.mockResolvedValue({
|
|
269
|
+
exists: false,
|
|
270
|
+
});
|
|
271
|
+
await expect(sessionService.ensureSession('user1', tokenIssuedAt)).rejects.toThrow(TokenRevokedError);
|
|
272
|
+
expect(mockDoc.set).not.toHaveBeenCalled();
|
|
273
|
+
});
|
|
274
|
+
it('should create session if token was issued after logout', async () => {
|
|
275
|
+
// Mock logout record exists but token was issued after
|
|
276
|
+
const loggedOutAt = new Date();
|
|
277
|
+
const tokenIssuedAt = new Date(loggedOutAt.getTime() + 1000); // 1 second after logout
|
|
278
|
+
mockLogoutDoc.get.mockResolvedValue({
|
|
279
|
+
exists: true,
|
|
280
|
+
data: () => ({
|
|
281
|
+
userId: 'user1',
|
|
282
|
+
loggedOutAt: { toDate: () => loggedOutAt },
|
|
283
|
+
expiresAt: { toDate: () => new Date(loggedOutAt.getTime() + 3600000) }, // 1 hour TTL, still valid
|
|
284
|
+
}),
|
|
285
|
+
});
|
|
286
|
+
// Mock Firestore to return no document (session doesn't exist)
|
|
287
|
+
mockDoc.get.mockResolvedValue({
|
|
288
|
+
exists: false,
|
|
289
|
+
});
|
|
290
|
+
const wasCreated = await sessionService.ensureSession('user1', tokenIssuedAt);
|
|
291
|
+
expect(wasCreated).toBe(true);
|
|
292
|
+
expect(cache.get('user1')).toBeTruthy();
|
|
293
|
+
expect(mockDoc.set).toHaveBeenCalled();
|
|
294
|
+
});
|
|
295
|
+
it('should work without tokenIssuedAt parameter (backward compatibility)', async () => {
|
|
296
|
+
// Mock Firestore to return no document (session doesn't exist)
|
|
297
|
+
mockDoc.get.mockResolvedValue({
|
|
298
|
+
exists: false,
|
|
299
|
+
});
|
|
300
|
+
const wasCreated = await sessionService.ensureSession('user1');
|
|
301
|
+
expect(wasCreated).toBe(true);
|
|
302
|
+
expect(cache.get('user1')).toBeTruthy();
|
|
303
|
+
expect(mockDoc.set).toHaveBeenCalled();
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
describe('updateLastActivity', () => {
|
|
307
|
+
it('should update cache immediately and queue Firestore write', async () => {
|
|
308
|
+
const originalTime = new Date(Date.now() - 1000); // Set time 1 second ago
|
|
309
|
+
const originalExpiresAt = new Date(Date.now() + inactivityTimeout); // Set expiresAt in the future (valid)
|
|
310
|
+
const session = {
|
|
311
|
+
userId: 'user1',
|
|
312
|
+
createdAt: originalTime,
|
|
313
|
+
lastActivityAt: originalTime,
|
|
314
|
+
expiresAt: originalExpiresAt,
|
|
315
|
+
};
|
|
316
|
+
cache.set('user1', session);
|
|
317
|
+
const queueWriteSpy = vi.spyOn(firestoreSync, 'queueWrite');
|
|
318
|
+
await sessionService.updateLastActivity('user1');
|
|
319
|
+
const updatedSession = cache.get('user1');
|
|
320
|
+
expect(updatedSession).toBeTruthy();
|
|
321
|
+
// Verify that lastActivityAt was updated (should be more recent)
|
|
322
|
+
expect(updatedSession.lastActivityAt.getTime()).toBeGreaterThanOrEqual(originalTime.getTime());
|
|
323
|
+
// Verify expiresAt was also updated (should be in the future now)
|
|
324
|
+
expect(updatedSession.expiresAt.getTime()).toBeGreaterThan(Date.now());
|
|
325
|
+
expect(updatedSession.expiresAt.getTime()).toBeGreaterThanOrEqual(originalExpiresAt.getTime());
|
|
326
|
+
expect(queueWriteSpy).toHaveBeenCalled();
|
|
327
|
+
});
|
|
328
|
+
it('should load session from Firestore if not in cache', async () => {
|
|
329
|
+
const now = new Date();
|
|
330
|
+
const expiresAt = new Date(now.getTime() + inactivityTimeout);
|
|
331
|
+
mockDoc.get.mockResolvedValue({
|
|
332
|
+
exists: true,
|
|
333
|
+
data: () => ({
|
|
334
|
+
userId: 'user1',
|
|
335
|
+
createdAt: { toDate: () => now },
|
|
336
|
+
lastActivityAt: { toDate: () => now },
|
|
337
|
+
expiresAt: { toDate: () => expiresAt },
|
|
338
|
+
}),
|
|
339
|
+
});
|
|
340
|
+
const queueWriteSpy = vi.spyOn(firestoreSync, 'queueWrite');
|
|
341
|
+
await sessionService.updateLastActivity('user1');
|
|
342
|
+
expect(cache.get('user1')).toBeTruthy();
|
|
343
|
+
// Verify the session was loaded and updated
|
|
344
|
+
const updatedSession = cache.get('user1');
|
|
345
|
+
expect(updatedSession).toBeTruthy();
|
|
346
|
+
expect(updatedSession.lastActivityAt.getTime()).toBeGreaterThanOrEqual(now.getTime());
|
|
347
|
+
expect(queueWriteSpy).toHaveBeenCalled();
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
describe('clearSession', () => {
|
|
351
|
+
it('should clear cache, store logout timestamp, and delete from Firestore', async () => {
|
|
352
|
+
const session = {
|
|
353
|
+
userId: 'user1',
|
|
354
|
+
createdAt: new Date(),
|
|
355
|
+
lastActivityAt: new Date(),
|
|
356
|
+
expiresAt: new Date(Date.now() + inactivityTimeout),
|
|
357
|
+
};
|
|
358
|
+
cache.set('user1', session);
|
|
359
|
+
await sessionService.clearSession('user1');
|
|
360
|
+
expect(cache.get('user1')).toBeNull();
|
|
361
|
+
expect(mockDoc.delete).toHaveBeenCalled();
|
|
362
|
+
// Verify logout timestamp was stored
|
|
363
|
+
expect(mockFirestore.collection).toHaveBeenCalledWith('user_logouts');
|
|
364
|
+
expect(mockLogoutDoc.set).toHaveBeenCalledWith(expect.objectContaining({
|
|
365
|
+
userId: 'user1',
|
|
366
|
+
loggedOutAt: expect.any(Date),
|
|
367
|
+
expiresAt: expect.any(Date),
|
|
368
|
+
}));
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
describe('wasTokenIssuedBeforeLogout', () => {
|
|
372
|
+
it('should return false if no logout record exists', async () => {
|
|
373
|
+
mockLogoutDoc.get.mockResolvedValue({
|
|
374
|
+
exists: false,
|
|
375
|
+
});
|
|
376
|
+
const tokenIssuedAt = new Date();
|
|
377
|
+
const wasIssuedBeforeLogout = await sessionService.wasTokenIssuedBeforeLogout('user1', tokenIssuedAt);
|
|
378
|
+
expect(wasIssuedBeforeLogout).toBe(false);
|
|
379
|
+
});
|
|
380
|
+
it('should still check token validity even if logout record has expired (TTL is only for cleanup)', async () => {
|
|
381
|
+
const loggedOutAt = new Date(Date.now() - 2 * 60 * 60 * 1000); // 2 hours ago
|
|
382
|
+
const tokenIssuedAt = new Date(loggedOutAt.getTime() - 1000); // 1 second before logout
|
|
383
|
+
// Logout record exists but has expired (for cleanup purposes)
|
|
384
|
+
mockLogoutDoc.get.mockResolvedValue({
|
|
385
|
+
exists: true,
|
|
386
|
+
data: () => ({
|
|
387
|
+
userId: 'user1',
|
|
388
|
+
loggedOutAt: { toDate: () => loggedOutAt },
|
|
389
|
+
expiresAt: { toDate: () => new Date(loggedOutAt.getTime() + 3600000) }, // 1 hour TTL, expired
|
|
390
|
+
}),
|
|
391
|
+
});
|
|
392
|
+
// Token was issued before logout, so it should be rejected even though logout record expired
|
|
393
|
+
const wasIssuedBeforeLogout = await sessionService.wasTokenIssuedBeforeLogout('user1', tokenIssuedAt);
|
|
394
|
+
expect(wasIssuedBeforeLogout).toBe(true);
|
|
395
|
+
});
|
|
396
|
+
it('should return true if token was issued before logout', async () => {
|
|
397
|
+
const loggedOutAt = new Date();
|
|
398
|
+
const tokenIssuedAt = new Date(loggedOutAt.getTime() - 1000); // 1 second before logout
|
|
399
|
+
mockLogoutDoc.get.mockResolvedValue({
|
|
400
|
+
exists: true,
|
|
401
|
+
data: () => ({
|
|
402
|
+
userId: 'user1',
|
|
403
|
+
loggedOutAt: { toDate: () => loggedOutAt },
|
|
404
|
+
expiresAt: { toDate: () => new Date(loggedOutAt.getTime() + 3600000) }, // 1 hour TTL, still valid
|
|
405
|
+
}),
|
|
406
|
+
});
|
|
407
|
+
const wasIssuedBeforeLogout = await sessionService.wasTokenIssuedBeforeLogout('user1', tokenIssuedAt);
|
|
408
|
+
expect(wasIssuedBeforeLogout).toBe(true);
|
|
409
|
+
});
|
|
410
|
+
it('should return false if token was issued after logout', async () => {
|
|
411
|
+
const loggedOutAt = new Date();
|
|
412
|
+
const tokenIssuedAt = new Date(loggedOutAt.getTime() + 1000); // 1 second after logout
|
|
413
|
+
mockLogoutDoc.get.mockResolvedValue({
|
|
414
|
+
exists: true,
|
|
415
|
+
data: () => ({
|
|
416
|
+
userId: 'user1',
|
|
417
|
+
loggedOutAt: { toDate: () => loggedOutAt },
|
|
418
|
+
expiresAt: { toDate: () => new Date(loggedOutAt.getTime() + 3600000) }, // 1 hour TTL, still valid
|
|
419
|
+
}),
|
|
420
|
+
});
|
|
421
|
+
const wasIssuedBeforeLogout = await sessionService.wasTokenIssuedBeforeLogout('user1', tokenIssuedAt);
|
|
422
|
+
expect(wasIssuedBeforeLogout).toBe(false);
|
|
423
|
+
});
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
//# sourceMappingURL=sessionService.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionService.test.js","sourceRoot":"","sources":["../../src/session/sessionService.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error for token verification
|
|
3
|
+
*/
|
|
4
|
+
export declare class TokenVerificationError extends Error {
|
|
5
|
+
originalError?: Error | undefined;
|
|
6
|
+
constructor(message: string, originalError?: Error | undefined);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Error thrown when token verification fails
|
|
10
|
+
* Includes isExpired flag for expired tokens
|
|
11
|
+
* Compatible with UserTokenVerificationError interface
|
|
12
|
+
*/
|
|
13
|
+
export declare class TokenVerificationFailedError extends TokenVerificationError {
|
|
14
|
+
isExpired?: boolean;
|
|
15
|
+
constructor(message: string, isExpired?: boolean, originalError?: Error);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Error thrown when token verifier configuration is invalid
|
|
19
|
+
*/
|
|
20
|
+
export declare class TokenVerifierConfigurationError extends Error {
|
|
21
|
+
constructor(message: string);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/tokenVerifier/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IACX,aAAa,CAAC,EAAE,KAAK;gBAA7C,OAAO,EAAE,MAAM,EAAS,aAAa,CAAC,EAAE,KAAK,YAAA;CAI1D;AAED;;;;GAIG;AACH,qBAAa,4BAA6B,SAAQ,sBAAsB;IAC/D,SAAS,CAAC,EAAE,OAAO,CAAC;gBAEf,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,KAAK;CAKxE;AAED;;GAEG;AACH,qBAAa,+BAAgC,SAAQ,KAAK;gBAC5C,OAAO,EAAE,MAAM;CAI5B"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error for token verification
|
|
3
|
+
*/
|
|
4
|
+
export class TokenVerificationError extends Error {
|
|
5
|
+
originalError;
|
|
6
|
+
constructor(message, originalError) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.originalError = originalError;
|
|
9
|
+
this.name = 'TokenVerificationError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Error thrown when token verification fails
|
|
14
|
+
* Includes isExpired flag for expired tokens
|
|
15
|
+
* Compatible with UserTokenVerificationError interface
|
|
16
|
+
*/
|
|
17
|
+
export class TokenVerificationFailedError extends TokenVerificationError {
|
|
18
|
+
isExpired;
|
|
19
|
+
constructor(message, isExpired, originalError) {
|
|
20
|
+
super(message, originalError);
|
|
21
|
+
this.name = 'TokenVerificationFailedError';
|
|
22
|
+
this.isExpired = isExpired;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Error thrown when token verifier configuration is invalid
|
|
27
|
+
*/
|
|
28
|
+
export class TokenVerifierConfigurationError extends Error {
|
|
29
|
+
constructor(message) {
|
|
30
|
+
super(`Token Verifier Configuration Error: ${message}`);
|
|
31
|
+
this.name = 'TokenVerifierConfigurationError';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/tokenVerifier/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACX;IAApC,YAAY,OAAe,EAAS,aAAqB;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,kBAAa,GAAb,aAAa,CAAQ;QAEvD,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,4BAA6B,SAAQ,sBAAsB;IAC/D,SAAS,CAAW;IAE3B,YAAY,OAAe,EAAE,SAAmB,EAAE,aAAqB;QACrE,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,+BAAgC,SAAQ,KAAK;IACxD,YAAY,OAAe;QACzB,KAAK,CAAC,uCAAuC,OAAO,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAC;IAChD,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { TokenVerifierConfig } from './types.js';
|
|
2
|
+
import type { UserTokenVerifier, Logger } from '../types/middleware.js';
|
|
3
|
+
/**
|
|
4
|
+
* Default JWT token verifier implementation using jose library
|
|
5
|
+
* Supports JWKS URIs, static public keys, and skip verification mode
|
|
6
|
+
*/
|
|
7
|
+
export declare class JoseTokenVerifier implements UserTokenVerifier {
|
|
8
|
+
private config;
|
|
9
|
+
private logger?;
|
|
10
|
+
private jwksClient?;
|
|
11
|
+
private cachedPublicKey?;
|
|
12
|
+
constructor(config: TokenVerifierConfig, logger?: Logger | undefined);
|
|
13
|
+
verify(token: string, correlationId?: string): Promise<{
|
|
14
|
+
sub: string;
|
|
15
|
+
email?: string;
|
|
16
|
+
name?: string;
|
|
17
|
+
}>;
|
|
18
|
+
private getVerificationKey;
|
|
19
|
+
/**
|
|
20
|
+
* Clear cached keys (useful for testing or key rotation)
|
|
21
|
+
*/
|
|
22
|
+
clearCache(): void;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=joseTokenVerifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"joseTokenVerifier.d.ts","sourceRoot":"","sources":["../../src/tokenVerifier/joseTokenVerifier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAKtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAExE;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,iBAAiB;IAKvD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM,CAAC;IALjB,OAAO,CAAC,UAAU,CAAC,CAA6C;IAChE,OAAO,CAAC,eAAe,CAAC,CAAe;gBAG7B,MAAM,EAAE,mBAAmB,EAC3B,MAAM,CAAC,EAAE,MAAM,YAAA;IAUnB,MAAM,CACV,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;YAiH5C,kBAAkB;IA6ChC;;OAEG;IACH,UAAU,IAAI,IAAI;CAQnB"}
|