firebase-tools icon indicating copy to clipboard operation
firebase-tools copied to clipboard

Auth emulator: send metadata timestamps as int instead of string

Open valeriangalliat opened this issue 1 year ago • 0 comments

Description

In the auth emulator sign in blocking function, send metadata.last_sign_in_time and metadata.creation_time as numbers and not strings so that firebase-functions can handle them.

This is already implemented for calling Cloud Functions associated with other auth events: https://github.com/firebase/firebase-tools/blob/d01da701554ac3c33786dd6486469293e0c93253/src/emulator/auth/cloudFunctions.ts#L77-L84

But it's missing for the sign in blocking function call.

This results in sending string timestamps in the metadata:

metadata: {
  last_sign_in_time: '1665001706543',
  creation_time: '1697150491509'
}

This is unsupported by the firebase-functions framework on the other side, that expects a number: https://github.com/firebase/firebase-functions/blob/9c818713db511895a33378859ab1b9f2eef99179/src/common/providers/identity.ts#L363-L366

In particular, the way it uses it: https://github.com/firebase/firebase-functions/blob/9c818713db511895a33378859ab1b9f2eef99179/src/common/providers/identity.ts#L516-L521

    const creationTime = metadata?.creation_time
      ? new Date(metadata.creation_time).toUTCString()
      : null;
    const lastSignInTime = metadata?.last_sign_in_time
      ? new Date(metadata.last_sign_in_time).toUTCString()
      : null;

This results in e.g.:

    new Date('1697150491509').toUTCString()
    => 'Invalid Date'

By sending a number, we make sure that the receiving end can process the timestamps.

Scenarios Tested

  • Signing in to the emulator as an existing user

valeriangalliat avatar Jun 12 '24 00:06 valeriangalliat