signIn method
Signs in to Firebase Auth using Email & Password.
Implementation
Future<void> signIn() async {
_log.info('Signing in to Firebase Auth as $email...');
// Check if emulator is being used
final isEmulator =
Platform.environment['FUNCTIONS_EMULATOR'] == 'true' ||
Platform.environment['FIRESTORE_EMULATOR_HOST'] != null;
if (isEmulator) {
_log.info('Using emulator mode. Simulating authentication token.');
_idToken = 'emulator-token';
_refreshToken = 'emulator-refresh-token';
_tokenExpiry = DateTime.now().add(const Duration(hours: 24));
return;
}
final url = '$firebaseSignInUrl?key=$apiKey';
final response = await http.post(
Uri.parse(url),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({
'email': email,
'password': password,
'returnSecureToken': true,
}),
);
if (response.statusCode != 200) {
throw HttpException(
'Firebase sign in failed: ${response.statusCode} ${response.body}',
);
}
final data = jsonDecode(response.body) as Map<String, dynamic>;
_idToken = data['idToken'] as String?;
_refreshToken = data['refreshToken'] as String?;
final expiresInStr = data['expiresIn'] as String? ?? '3600';
final expiresIn = int.tryParse(expiresInStr) ?? 3600;
_tokenExpiry = DateTime.now().add(Duration(seconds: expiresIn));
_log.info('Successfully signed in. Token expires in ${expiresIn}s');
}