authenticate static method

Future<GoogleAuthSuccess> authenticate(
  1. Session session, {
  2. required String idToken,
  3. 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

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

  var googleAccount = await GoogleAccount.db.findFirstRow(
    session,
    where: (final t) => t.userIdentifier.equals(
      accountDetails.userIdentifier,
    ),
    transaction: transaction,
  );
  final authUserNewlyCreated = googleAccount == null;

  if (googleAccount == null) {
    await DatabaseUtil.runInTransactionOrSavepoint(
      session.db,
      transaction,
      (final transaction) async {
        final authUser = await AuthUsers.create(
          session,
          transaction: transaction,
        );

        googleAccount = await admin.linkGoogleAuthentication(
          session,
          authUserId: authUser.id,
          accountDetails: accountDetails,
          transaction: transaction,
        );
      },
    );
  }

  return (
    googleAccountId: googleAccount!.id!,
    authUserId: googleAccount!.authUserId,
    details: accountDetails,
    authUserNewlyCreated: authUserNewlyCreated,
  );
}