authenticate method

Future<FirebaseAuthSuccess> authenticate(
  1. Session session, {
  2. required String idToken,
  3. required Transaction? transaction,
})

Authenticates a user using an ID token.

If the external user ID is not yet known in the system, a new AuthUser is created for it.

Implementation

Future<FirebaseAuthSuccess> authenticate(
  final Session session, {
  required final String idToken,
  required final Transaction? transaction,
}) async {
  final accountDetails = await fetchAccountDetails(
    session,
    idToken: idToken,
  );

  var firebaseAccount = await FirebaseAccount.db.findFirstRow(
    session,
    where: (final t) => t.userIdentifier.equals(
      accountDetails.userIdentifier,
    ),
    transaction: transaction,
  );

  final createNewUser = firebaseAccount == null;

  final AuthUserModel authUser = switch (createNewUser) {
    true => await _authUsers.create(
      session,
      transaction: transaction,
    ),
    false => await _authUsers.get(
      session,
      authUserId: firebaseAccount!.authUserId,
      transaction: transaction,
    ),
  };

  if (createNewUser) {
    firebaseAccount = await linkFirebaseAuthentication(
      session,
      authUserId: authUser.id,
      accountDetails: accountDetails,
      transaction: transaction,
    );
  }

  return (
    firebaseAccountId: firebaseAccount.id!,
    authUserId: firebaseAccount.authUserId,
    details: accountDetails,
    newAccount: createNewUser,
    scopes: authUser.scopes,
  );
}