reauthenticateWithPassword method

  1. @override
Future<Either<AuthServiceSignInFailure, Unit>> reauthenticateWithPassword(
  1. String password
)
override

Re-authenticate current user with password for sensitive operations

Required before operations like changing email, password, or deleting account

Implementation

@override
Future<Either<AuthServiceSignInFailure, Unit>> reauthenticateWithPassword(
  String password,
) async {
  try {
    final user = _fbAuth.currentUser;
    if (user == null) {
      logw('reauthenticateWithPassword: No user logged in');
      return left(AuthServiceSignInFailure.userNotFound);
    }

    final email = user.email;
    if (email == null) {
      logw('reauthenticateWithPassword: User has no email');
      return left(AuthServiceSignInFailure.invalidEmail);
    }

    logd('reauthenticateWithPassword: Re-authenticating user');

    // Create credential and re-authenticate
    final credential = fb_auth.EmailAuthProvider.credential(
      email: email,
      password: password,
    );

    await user.reauthenticateWithCredential(credential);
    logd('reauthenticateWithPassword: Re-authentication successful');

    return right(unit);
  } on fb_auth.FirebaseAuthException catch (e) {
    loge(e, 'reauthenticateWithPassword failed');
    switch (e.code) {
      case 'wrong-password':
        return left(AuthServiceSignInFailure.wrongPassword);
      case 'invalid-credential':
        return left(AuthServiceSignInFailure.invalidCredential);
      case 'user-disabled':
        return left(AuthServiceSignInFailure.userDisabled);
      case 'too-many-requests':
        return left(AuthServiceSignInFailure.tooManyRequests);
      default:
        return left(AuthServiceSignInFailure.unexpected);
    }
  } catch (e) {
    loge(e, 'reauthenticateWithPassword failed');
    return left(AuthServiceSignInFailure.unexpected);
  }
}