Firebase выходит из системы после долгого пребывания во Flutter Web
Я разрабатываю веб-приложение и использую Firebase Authentication для службы аутентификации.
Кажется, что в проекте хранится аутентификация, поскольку, если я обновляю страницу или закрываю браузер, пользователь все равно находится в системе.
Однако я заметил, что если я не обращаюсь к приложению в течение длительного времени (более 1 часа, например, после ночи), аутентификация теряется.
Я не знаю, как это отладить и как это решить.
Следуя некоторым фрагментам кода, чтобы лучше понять мою реализацию:
Это функция, которая есть в моем стартовом представлении для перенаправления пользователя на нужную страницу в зависимости от статуса авторизации.
bool isUserLoggedIn() {
var user = _firebaseAuth.currentUser;
return user != null;
}
void handleStartupBasedOnAuthStatus() {
Future.delayed(const Duration(milliseconds: 1000), () async {
bool loggedInShared =
await sharedPreferences.getBoolSharedPreferences("loggedIn");
if (isUserLoggedIn() || loggedInShared) {
String ruoloValue =
await sharedPreferences.getSharedPreferences('ruolo');
(ruoloValue == Ruolo.ADMIN)
? navigationService.replaceWith(Routes.admin)
: navigationService.replaceWith(Routes.messages);
} else {
navigationService.replaceWith(Routes.login);
}
});
}
В следующей функции я вызываю onAuthStateChange для соответствующей установки общих предпочтений. У меня есть проверка метки времени, потому что я заметил, что она запускается еще раз после обновления страницы.
void listenToAuthChangesSharedPref() {
FirebaseAuth.instance.authStateChanges().listen((firebaseUser) async {
var datetimeNow = (DateTime.now().millisecondsSinceEpoch);
String oldDatetimeString =
await sharedPreferences.getSharedPreferences('previous_timestamp');
if (oldDatetimeString != null) {
var oldDatetime = (new DateTime.fromMillisecondsSinceEpoch(
int.parse(oldDatetimeString)))
.millisecondsSinceEpoch;
if (datetimeNow - oldDatetime > 1000) {
if (firebaseUser == null) {
await sharedPreferences.setBoolSharedPreferences('loggedIn', false);
} else {
await sharedPreferences.setBoolSharedPreferences('loggedIn', true);
}
await sharedPreferences.setSharedPreferences(
'previous_timestamp', datetimeNow.toString());
}
} else {
if (firebaseUser == null) {
await sharedPreferences.setBoolSharedPreferences('loggedIn', false);
} else {
await sharedPreferences.setBoolSharedPreferences('loggedIn', true);
}
await sharedPreferences.setSharedPreferences(
'previous_timestamp', datetimeNow.toString());
}
});
}
Мой вопрос: возможно ли, что через долгое время вызывается currentUser, а также onAuthStateChanges, и пользователь не вошел в систему?
1 ответ
Сохранение состояния аутентификации # Пакеты Firebase SDK для всех платформ предоставляют встроенную поддержку, гарантирующую, что состояние аутентификации вашего пользователя сохраняется при перезапуске приложения или перезагрузке страницы.
На собственных платформах, таких как Android и iOS, это поведение нельзя настроить, и состояние проверки подлинности пользователя будет сохраняться на устройстве между перезапусками приложения. Пользователь может очистить кэшированные данные приложений через настройки устройства, которые сотрут любое существующее сохраненное состояние.
На веб-платформах состояние аутентификации пользователя хранится в локальном хранилище. При необходимости вы можете изменить это поведение по умолчанию, чтобы сохранить состояние проверки подлинности только для текущего сеанса или не сохранять его вовсе. Чтобы настроить эти параметры, вызовите метод setPersistence() (обратите внимание: на нативных платформах будет выдано UnimplementedError):
// Отключить сохраняемость на веб-платформах
await FirebaseAuth.instance.setPersistence(Persistence.NONE);
для получения дополнительной информации: