@@ -125,8 +125,8 @@ describe('FirebaseTokenGenerator', () => {
125125
126126 it ( 'should generate a valid unsigned token' , async ( ) => {
127127 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 } ) ;
130130
131131 // Check that verify doesn't throw
132132 // Note: the types for jsonwebtoken are wrong so we have to disguise the 'null'
@@ -136,7 +136,7 @@ describe('FirebaseTokenGenerator', () => {
136136 const { header, payload, signature } = jwt . decode ( token , { complete : true } ) as { [ key : string ] : any } ;
137137 expect ( header ) . to . deep . equal ( { alg : 'none' , typ : 'JWT' } ) ;
138138 expect ( payload [ 'uid' ] ) . to . equal ( uid ) ;
139- expect ( payload [ 'claims' ] ) . to . deep . equal ( claims ) ;
139+ expect ( payload [ 'claims' ] ) . to . deep . equal ( developerClaims ) ;
140140 expect ( signature ) . to . equal ( '' ) ;
141141 } ) ;
142142
@@ -183,11 +183,20 @@ describe('FirebaseTokenGenerator', () => {
183183 } ) . to . throw ( FirebaseAuthError ) . with . property ( 'code' , 'auth/argument-error' ) ;
184184 } ) ;
185185
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+
186195 it ( 'should throw given a non-object developer claims' , ( ) => {
187196 const invalidDeveloperClaims : any [ ] = [ null , NaN , [ ] , true , false , '' , 'a' , 0 , 1 , Infinity , _ . noop ] ;
188197 invalidDeveloperClaims . forEach ( ( invalidDevClaims ) => {
189198 expect ( ( ) => {
190- tokenGenerator . createCustomToken ( mocks . uid , invalidDevClaims ) ;
199+ tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : invalidDevClaims } ) ;
191200 } ) . to . throw ( FirebaseAuthError ) . with . property ( 'code' , 'auth/argument-error' ) ;
192201 } ) ;
193202 } ) ;
@@ -197,21 +206,39 @@ describe('FirebaseTokenGenerator', () => {
197206 const blacklistedDeveloperClaims : { [ key : string ] : any } = _ . clone ( mocks . developerClaims ) ;
198207 blacklistedDeveloperClaims [ blacklistedClaim ] = true ;
199208 expect ( ( ) => {
200- tokenGenerator . createCustomToken ( mocks . uid , blacklistedDeveloperClaims ) ;
209+ tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : blacklistedDeveloperClaims } ) ;
201210 } ) . to . throw ( FirebaseAuthError , blacklistedClaim ) . with . property ( 'code' , 'auth/argument-error' ) ;
202211 } ) ;
203212 } ) ;
204213
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+
205223 it ( 'should be fulfilled given a valid uid and no developer claims' , ( ) => {
206224 return tokenGenerator . createCustomToken ( mocks . uid ) ;
207225 } ) ;
208226
209227 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 : { } } ) ;
211229 } ) ;
212230
213231 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 } ) ;
215242 } ) ;
216243
217244 it ( 'should be fulfilled with a Firebase Custom JWT' , ( ) => {
@@ -246,7 +273,7 @@ describe('FirebaseTokenGenerator', () => {
246273 it ( 'should be fulfilled with a JWT with the developer claims in its decoded payload' , ( ) => {
247274 clock = sinon . useFakeTimers ( 1000 ) ;
248275
249- return tokenGenerator . createCustomToken ( mocks . uid , mocks . developerClaims )
276+ return tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : mocks . developerClaims } )
250277 . then ( ( token ) => {
251278 const decoded = jwt . decode ( token ) ;
252279
@@ -272,6 +299,32 @@ describe('FirebaseTokenGenerator', () => {
272299 } ) ;
273300 } ) ;
274301
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+
275328 it ( 'should be fulfilled with a JWT with the correct header' , ( ) => {
276329 clock = sinon . useFakeTimers ( 1000 ) ;
277330
@@ -329,7 +382,7 @@ describe('FirebaseTokenGenerator', () => {
329382 foo : 'bar' ,
330383 } ;
331384 const clonedClaims = _ . clone ( originalClaims ) ;
332- return tokenGenerator . createCustomToken ( mocks . uid , clonedClaims )
385+ return tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : clonedClaims } )
333386 . then ( ( ) => {
334387 expect ( originalClaims ) . to . deep . equal ( clonedClaims ) ;
335388 } ) ;
0 commit comments