signInWithFirebase function

Future<UserInfo?> signInWithFirebase({
  1. required Caller caller,
  2. required List<AuthProvider<AuthListener, AuthCredential>> authProviders,
  3. required BuildContext context,
  4. bool debug = false,
})

Attempts to Sign in with Firebase. If successful, a UserInfo is returned. If the attempt is not a success, null is returned.

Implementation

Future<UserInfo?> signInWithFirebase({
  required Caller caller,
  required List<AuthProvider> authProviders,
  required BuildContext context,
  bool debug = false,
}) async {
  final navigator = Navigator.of(context);
  return navigator.push<UserInfo?>(
    MaterialPageRoute(
      builder: (context) {
        return SignInScreen(
          providers: authProviders,
          actions: [
            AuthCancelledAction((context) {
              navigator.maybePop();
            }),
            AuthStateChangeAction<SignedIn>((context, state) async {
              if (state.user == null) {
                navigator.maybePop();
                return;
              } else {
                var user = state.user!;

                try {
                  var idToken = await user.getIdToken();
                  if (idToken == null) {
                    if (kDebugMode) {
                      print(
                        'serverpod_auth_firebase: Failed to get ID token. '
                        'Aborting.',
                      );
                    }
                    navigator.maybePop();
                    return;
                  }

                  var serverResponse = await caller.firebase.authenticate(
                    idToken,
                  );

                  if (!serverResponse.success) {
                    // Failed to sign in.
                    if (kDebugMode) {
                      print(
                        'serverpod_auth_firebase: Failed to authenticate '
                        'with Serverpod backend: '
                        '${serverResponse.failReason ?? 'reason unknown'}'
                        '. Aborting.',
                      );
                    }
                    navigator.maybePop();
                    return;
                  }

                  // Store the user info in the session manager.
                  var sessionManager = await SessionManager.instance;
                  await sessionManager.registerSignedInUser(
                    serverResponse.userInfo!,
                    serverResponse.keyId!,
                    serverResponse.key!,
                  );

                  navigator.pop(serverResponse.userInfo);
                  return;
                } catch (e) {
                  if (kDebugMode) {
                    print(
                      'serverpod_auth_firebase: Failed to authenticate '
                      'with Serverpod backend: $e',
                    );
                  }
                  navigator.maybePop();
                  return;
                }
              }
            }),
          ],
        );
      },
    ),
  );
}