@@ -226,23 +226,31 @@ export class FirebaseTokenVerifier {
226
226
*
227
227
* @param jwtToken - The Firebase Auth JWT token to verify.
228
228
* @param isEmulator - Whether to accept Auth Emulator tokens.
229
+ * @param clockSkewSeconds - The number of seconds to tolerate when checking the token's iat. Must be between 0-60, and an integer. Defualts to 0.
229
230
* @returns A promise fulfilled with the decoded claims of the Firebase Auth ID token.
230
231
*/
231
- public verifyJWT ( jwtToken : string , isEmulator = false ) : Promise < FirebaseIdToken > {
232
+ public verifyJWT ( jwtToken : string , isEmulator = false , clockSkewSeconds : number = 5 ) : Promise < FirebaseIdToken > {
232
233
if ( ! isString ( jwtToken ) ) {
233
234
throw new FirebaseAuthError (
234
235
AuthClientErrorCode . INVALID_ARGUMENT ,
235
236
`First argument to ${ this . tokenInfo . verifyApiName } must be a ${ this . tokenInfo . jwtName } string.`
236
237
) ;
237
238
}
238
- return this . decodeAndVerify ( jwtToken , isEmulator ) . then ( payload => {
239
+
240
+ if ( clockSkewSeconds < 0 || clockSkewSeconds > 60 || ! Number . isInteger ( clockSkewSeconds ) ) {
241
+ throw new FirebaseAuthError (
242
+ AuthClientErrorCode . INVALID_ARGUMENT ,
243
+ 'clockSkewSeconds must be an integer between 0 and 60.'
244
+ )
245
+ }
246
+ return this . decodeAndVerify ( jwtToken , isEmulator , clockSkewSeconds ) . then ( payload => {
239
247
payload . uid = payload . sub ;
240
248
return payload ;
241
249
} ) ;
242
250
}
243
251
244
- private async decodeAndVerify ( token : string , isEmulator : boolean ) : Promise < FirebaseIdToken > {
245
- const currentTimestamp = Math . floor ( Date . now ( ) / 1000 ) ;
252
+ private async decodeAndVerify ( token : string , isEmulator : boolean , clockSkewSeconds : number = 5 ) : Promise < FirebaseIdToken > {
253
+ const currentTimestamp = Math . floor ( Date . now ( ) / 1000 ) + clockSkewSeconds ;
246
254
try {
247
255
const rs256Token = this . safeDecode ( token , isEmulator , currentTimestamp ) ;
248
256
const { payload } = rs256Token . decodedToken ;
0 commit comments