Firebase Auth sign-in/sign-up with Clean Architecture, BLoC, and starter kit integration
Authentication handles user sign-in and sign-up using Firebase Auth. The system auto-detects whether a user is new or existing based on email. The starter kit provides an AuthRepository interface.
skills/firebase-infrastructure/SKILL.md)firebase_auth dependency (via starter kit)authRepository providedfeatures/auth/
├── auth_injector.dart
├── data/
│ ├── datasources/
│ │ └── remote/
│ │ └── auth_remote_data_source.dart
│ ├── models/
│ │ └── user_model.dart
│ └── repositories/
│ └── auth_repo.dart
├── domain/
│ ├── entities/
│ │ └── user_entity.dart
│ ├── repositories/
│ │ └── auth_base_repo.dart
│ └── usecases/
│ ├── sign_in_usecase.dart
│ ├── sign_up_usecase.dart
│ ├── sign_out_usecase.dart
│ └── get_current_user_usecase.dart
└── presentation/
├── bloc/
│ └── auth_bloc/
│ ├── auth_bloc.dart
│ ├── auth_event.dart
│ └── auth_state.dart
├── screens/
│ └── auth_screen.dart
└── widgets/
└── auth_form.dart
// Entity
class UserEntity extends Equatable {
final String uid;
final String? email;
final String? displayName;
const UserEntity({required this.uid, this.email, this.displayName});
}
// Repository Interface
abstract class AuthBaseRepo {
Future<Either<Failure, UserEntity>> signIn(SignInParams params);
Future<Either<Failure, UserEntity>> signUp(SignUpParams params);
Future<Either<Failure, void>> signOut();
Future<Either<Failure, UserEntity?>> getCurrentUser();
}
class AuthRemoteDataSource {
final FirebaseAuth _auth = FirebaseAuth.instance;
Future<UserModel> signIn(String email, String password) async {
final credential = await _auth.signInWithEmailAndPassword(
email: email, password: password,
);
return UserModel.fromFirebaseUser(credential.user!);
}
}
// Events
class AuthSignIn extends AuthEvent { final String email, password; }
class AuthSignUp extends AuthEvent { final String email, password, name; }
class AuthSignOut extends AuthEvent {}
class AuthCheckStatus extends AuthEvent {}
// States
class AuthInitial extends AuthState {}
class AuthLoading extends AuthState {}
class AuthAuthenticated extends AuthState { final UserEntity user; }
class AuthUnauthenticated extends AuthState {}
class AuthError extends AuthState { final String message; }
Provide your auth repository to the starter kit:
await StarterKit.initialize(
authRepository: MyAuthRepository(),
);
users/{uid}sign_in, sign_up eventsisFirstTimeUser() checks after auth