@@ -125,8 +125,8 @@ describe('FirebaseTokenGenerator', () => {
125
125
126
126
it ( 'should generate a valid unsigned token' , async ( ) => {
127
127
const uid = 'uid123' ;
128
- const claims = { foo : 'bar' } ;
129
- const token = await tokenGenerator . createCustomToken ( uid , claims ) ;
128
+ const developerClaims = { foo : 'bar' } ;
129
+ const token = await tokenGenerator . createCustomToken ( uid , { developerClaims } ) ;
130
130
131
131
// Check that verify doesn't throw
132
132
// Note: the types for jsonwebtoken are wrong so we have to disguise the 'null'
@@ -136,7 +136,7 @@ describe('FirebaseTokenGenerator', () => {
136
136
const { header, payload, signature } = jwt . decode ( token , { complete : true } ) as { [ key : string ] : any } ;
137
137
expect ( header ) . to . deep . equal ( { alg : 'none' , typ : 'JWT' } ) ;
138
138
expect ( payload [ 'uid' ] ) . to . equal ( uid ) ;
139
- expect ( payload [ 'claims' ] ) . to . deep . equal ( claims ) ;
139
+ expect ( payload [ 'claims' ] ) . to . deep . equal ( developerClaims ) ;
140
140
expect ( signature ) . to . equal ( '' ) ;
141
141
} ) ;
142
142
@@ -183,11 +183,20 @@ describe('FirebaseTokenGenerator', () => {
183
183
} ) . to . throw ( FirebaseAuthError ) . with . property ( 'code' , 'auth/argument-error' ) ;
184
184
} ) ;
185
185
186
+ it ( 'should throw given a non-object options' , ( ) => {
187
+ const invalidOptions : any [ ] = [ NaN , [ ] , true , false , '' , 'a' , 0 , 1 , Infinity , _ . noop ] ;
188
+ invalidOptions . forEach ( ( opts ) => {
189
+ expect ( ( ) => {
190
+ tokenGenerator . createCustomToken ( mocks . uid , opts ) ;
191
+ } ) . to . throw ( FirebaseAuthError ) . with . property ( 'code' , 'auth/argument-error' ) ;
192
+ } ) ;
193
+ } ) ;
194
+
186
195
it ( 'should throw given a non-object developer claims' , ( ) => {
187
196
const invalidDeveloperClaims : any [ ] = [ null , NaN , [ ] , true , false , '' , 'a' , 0 , 1 , Infinity , _ . noop ] ;
188
197
invalidDeveloperClaims . forEach ( ( invalidDevClaims ) => {
189
198
expect ( ( ) => {
190
- tokenGenerator . createCustomToken ( mocks . uid , invalidDevClaims ) ;
199
+ tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : invalidDevClaims } ) ;
191
200
} ) . to . throw ( FirebaseAuthError ) . with . property ( 'code' , 'auth/argument-error' ) ;
192
201
} ) ;
193
202
} ) ;
@@ -197,21 +206,39 @@ describe('FirebaseTokenGenerator', () => {
197
206
const blacklistedDeveloperClaims : { [ key : string ] : any } = _ . clone ( mocks . developerClaims ) ;
198
207
blacklistedDeveloperClaims [ blacklistedClaim ] = true ;
199
208
expect ( ( ) => {
200
- tokenGenerator . createCustomToken ( mocks . uid , blacklistedDeveloperClaims ) ;
209
+ tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : blacklistedDeveloperClaims } ) ;
201
210
} ) . to . throw ( FirebaseAuthError , blacklistedClaim ) . with . property ( 'code' , 'auth/argument-error' ) ;
202
211
} ) ;
203
212
} ) ;
204
213
214
+ it ( 'should throw given an invalid expiresIn' , ( ) => {
215
+ const invalidExpiresIns : any [ ] = [ null , NaN , Infinity , _ . noop , 0 , 999 , 3600001 ] ;
216
+ invalidExpiresIns . forEach ( ( invalidExpiresIn ) => {
217
+ expect ( ( ) => {
218
+ tokenGenerator . createCustomToken ( mocks . uid , { expiresIn : invalidExpiresIn } ) ;
219
+ } ) . to . throw ( FirebaseAuthError ) . with . property ( 'code' , 'auth/argument-error' ) ;
220
+ } ) ;
221
+ } ) ;
222
+
205
223
it ( 'should be fulfilled given a valid uid and no developer claims' , ( ) => {
206
224
return tokenGenerator . createCustomToken ( mocks . uid ) ;
207
225
} ) ;
208
226
209
227
it ( 'should be fulfilled given a valid uid and empty object developer claims' , ( ) => {
210
- return tokenGenerator . createCustomToken ( mocks . uid , { } ) ;
228
+ return tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : { } } ) ;
211
229
} ) ;
212
230
213
231
it ( 'should be fulfilled given a valid uid and valid developer claims' , ( ) => {
214
- return tokenGenerator . createCustomToken ( mocks . uid , mocks . developerClaims ) ;
232
+ return tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : mocks . developerClaims } ) ;
233
+ } ) ;
234
+
235
+ it ( 'should be fulfilled given a valid uid, empty object developer claims and valid expiresIn' , ( ) => {
236
+ return tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : { } , expiresIn : 1000 } ) ;
237
+ } ) ;
238
+
239
+ it ( 'should be fulfilled given a valid uid, valid developer claims and valid expiresIn' , ( ) => {
240
+ return tokenGenerator
241
+ . createCustomToken ( mocks . uid , { developerClaims : mocks . developerClaims , expiresIn : 3600000 } ) ;
215
242
} ) ;
216
243
217
244
it ( 'should be fulfilled with a Firebase Custom JWT' , ( ) => {
@@ -246,7 +273,7 @@ describe('FirebaseTokenGenerator', () => {
246
273
it ( 'should be fulfilled with a JWT with the developer claims in its decoded payload' , ( ) => {
247
274
clock = sinon . useFakeTimers ( 1000 ) ;
248
275
249
- return tokenGenerator . createCustomToken ( mocks . uid , mocks . developerClaims )
276
+ return tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : mocks . developerClaims } )
250
277
. then ( ( token ) => {
251
278
const decoded = jwt . decode ( token ) ;
252
279
@@ -272,6 +299,32 @@ describe('FirebaseTokenGenerator', () => {
272
299
} ) ;
273
300
} ) ;
274
301
302
+ it ( 'should be fulfilled with a JWT with the expiresIn in its exp payload' , ( ) => {
303
+ clock = sinon . useFakeTimers ( 2000 ) ;
304
+ const expiresIn = 300900
305
+
306
+ return tokenGenerator . createCustomToken ( mocks . uid , { expiresIn } )
307
+ . then ( ( token ) => {
308
+ const decoded = jwt . decode ( token ) ;
309
+
310
+ const expected : { [ key : string ] : any } = {
311
+ uid : mocks . uid ,
312
+ iat : 2 ,
313
+ exp : 302 ,
314
+ aud : FIREBASE_AUDIENCE ,
315
+ iss : mocks . certificateObject . client_email ,
316
+ sub : mocks . certificateObject . client_email ,
317
+ } ;
318
+
319
+ if ( tokenGenerator . tenantId ) {
320
+ // eslint-disable-next-line @typescript-eslint/camelcase
321
+ expected . tenant_id = tokenGenerator . tenantId ;
322
+ }
323
+
324
+ expect ( decoded ) . to . deep . equal ( expected ) ;
325
+ } ) ;
326
+ } ) ;
327
+
275
328
it ( 'should be fulfilled with a JWT with the correct header' , ( ) => {
276
329
clock = sinon . useFakeTimers ( 1000 ) ;
277
330
@@ -329,7 +382,7 @@ describe('FirebaseTokenGenerator', () => {
329
382
foo : 'bar' ,
330
383
} ;
331
384
const clonedClaims = _ . clone ( originalClaims ) ;
332
- return tokenGenerator . createCustomToken ( mocks . uid , clonedClaims )
385
+ return tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : clonedClaims } )
333
386
. then ( ( ) => {
334
387
expect ( originalClaims ) . to . deep . equal ( clonedClaims ) ;
335
388
} ) ;
0 commit comments