@@ -28,6 +28,11 @@ export interface TokenRecord {
28
28
reason : string ;
29
29
}
30
30
31
+ export interface JwtData {
32
+ token : string ;
33
+ isImpersonated : boolean ;
34
+ }
35
+
31
36
const defaultOptions = {
32
37
tokenSecret : 'secret' ,
33
38
tokenConfigs : {
@@ -181,7 +186,12 @@ export class AccountsServer {
181
186
const { ip, userAgent } = infos ;
182
187
183
188
try {
184
- const sessionId = await this . db . createSession ( user . id , ip , userAgent ) ;
189
+ // TODO get a random token
190
+ const token = '' ;
191
+ const sessionId = await this . db . createSession ( user . id , token , {
192
+ ip,
193
+ userAgent,
194
+ } ) ;
185
195
const { accessToken, refreshToken } = this . createTokens ( sessionId ) ;
186
196
187
197
const loginResult = {
@@ -256,10 +266,15 @@ export class AccountsServer {
256
266
return { authorized : false } ;
257
267
}
258
268
269
+ // TODO get a random token
270
+ const token = '' ;
259
271
const newSessionId = await this . db . createSession (
260
272
impersonatedUser . id ,
261
- ip ,
262
- userAgent ,
273
+ token ,
274
+ {
275
+ ip,
276
+ userAgent,
277
+ } ,
263
278
{ impersonatorUserId : user . id }
264
279
) ;
265
280
const impersonationTokens = this . createTokens ( newSessionId , true ) ;
@@ -302,22 +317,24 @@ export class AccountsServer {
302
317
throw new AccountsError ( 'An accessToken and refreshToken are required' ) ;
303
318
}
304
319
305
- let sessionId ;
320
+ let sessionToken : string ;
306
321
try {
307
322
jwt . verify ( refreshToken , this . options . tokenSecret ) ;
308
- const decodedAccessToken : any = jwt . verify (
323
+ const decodedAccessToken = jwt . verify (
309
324
accessToken ,
310
325
this . options . tokenSecret ,
311
326
{
312
327
ignoreExpiration : true ,
313
328
}
314
- ) ;
315
- sessionId = decodedAccessToken . data . sessionId ;
329
+ ) as { data : JwtData } ;
330
+ sessionToken = decodedAccessToken . data . token ;
316
331
} catch ( err ) {
317
332
throw new AccountsError ( 'Tokens are not valid' ) ;
318
333
}
319
334
320
- const session : SessionType = await this . db . findSessionById ( sessionId ) ;
335
+ const session : SessionType = await this . db . findSessionByToken (
336
+ sessionToken
337
+ ) ;
321
338
if ( ! session ) {
322
339
throw new AccountsError ( 'Session not found' ) ;
323
340
}
@@ -327,11 +344,11 @@ export class AccountsServer {
327
344
if ( ! user ) {
328
345
throw new AccountsError ( 'User not found' , { id : session . userId } ) ;
329
346
}
330
- const tokens = this . createTokens ( sessionId ) ;
331
- await this . db . updateSession ( sessionId , ip , userAgent ) ;
347
+ const tokens = this . createTokens ( sessionToken ) ;
348
+ await this . db . updateSession ( sessionToken , { ip, userAgent } ) ;
332
349
333
350
const result = {
334
- sessionId,
351
+ sessionId : session . sessionId ,
335
352
user : this . sanitizeUser ( user ) ,
336
353
tokens,
337
354
} ;
@@ -353,20 +370,21 @@ export class AccountsServer {
353
370
354
371
/**
355
372
* @description Refresh a user token.
356
- * @param {string } sessionId - User session id .
373
+ * @param {string } token - User session token .
357
374
* @param {boolean } isImpersonated - Should be true if impersonating another user.
358
375
* @returns {Promise<Object> } - Return a new accessToken and refreshToken.
359
376
*/
360
377
public createTokens (
361
- sessionId : string ,
378
+ token : string ,
362
379
isImpersonated : boolean = false
363
380
) : TokensType {
364
381
const { tokenSecret, tokenConfigs } = this . options ;
382
+ const jwtData : JwtData = {
383
+ token,
384
+ isImpersonated,
385
+ } ;
365
386
const accessToken = generateAccessToken ( {
366
- data : {
367
- sessionId,
368
- isImpersonated,
369
- } ,
387
+ data : jwtData ,
370
388
secret : tokenSecret ,
371
389
config : tokenConfigs . accessToken || { } ,
372
390
} ) ;
@@ -453,25 +471,30 @@ export class AccountsServer {
453
471
}
454
472
}
455
473
474
+ /**
475
+ * @description Find a session by his token.
476
+ * @param {string } accessToken
477
+ * @returns {Promise<SessionType> } - Return a session.
478
+ */
456
479
public async findSessionByAccessToken (
457
480
accessToken : string
458
481
) : Promise < SessionType > {
459
482
if ( ! isString ( accessToken ) ) {
460
483
throw new AccountsError ( 'An accessToken is required' ) ;
461
484
}
462
485
463
- let sessionId ;
486
+ let sessionToken : string ;
464
487
try {
465
- const decodedAccessToken : any = jwt . verify (
488
+ const decodedAccessToken = jwt . verify (
466
489
accessToken ,
467
490
this . options . tokenSecret
468
- ) ;
469
- sessionId = decodedAccessToken . data . sessionId ;
491
+ ) as { data : JwtData } ;
492
+ sessionToken = decodedAccessToken . data . token ;
470
493
} catch ( err ) {
471
494
throw new AccountsError ( 'Tokens are not valid' ) ;
472
495
}
473
496
474
- const session : SessionType = await this . db . findSessionById ( sessionId ) ;
497
+ const session : SessionType = await this . db . findSessionByToken ( sessionToken ) ;
475
498
if ( ! session ) {
476
499
throw new AccountsError ( 'Session not found' ) ;
477
500
}
0 commit comments