【问题标题】:Firebase gets logged out after long time in Flutter Web在 Flutter Web 中长时间使用 Firebase 后退出
【发布时间】:2021-01-02 22:35:04
【问题描述】:

我正在开发一个网络应用,我使用 Firebase 身份验证作为身份验证服务。

该项目似乎存储了身份验证,因为如果我刷新页面或关闭浏览器,用户仍处于登录状态。

但是我注意到,如果我长时间不访问应用程序(超过 1 小时,例如晚上之后),身份验证就会丢失。

我不知道如何调试以及如何解决这个问题。

遵循一些 sn-ps 代码以更好地理解我的实现:

这是我在启动视图中根据身份验证状态将用户重定向到正确页面的功能。

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 来相应地设置 sharedpreferences。我检查了时间戳,因为我注意到刷新页面后会触发更多时间。

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 被调用并且用户没有登录?

【问题讨论】:

    标签: firebase firebase-authentication flutter-web hummingbird


    【解决方案1】:

    保持身份验证状态# 适用于所有平台的 Firebase SDK 提供开箱即用的支持,以确保您的用户的身份验证状态在应用重新启动或页面重新加载时保持不变。

    在 Android 和 iOS 等原生平台上,此行为不可配置,并且用户的身份验证状态将在应用重新启动之间保留在设备上。用户可以通过设备设置清除应用程序缓存的数据,这将擦除任何正在存储的现有状态。

    在 Web 平台上,用户的身份验证状态存储在本地存储中。如果需要,您可以将此默认行为更改为仅保留当前会话的身份验证状态,或者根本不保留。要配置这些设置,请调用 setPersistence() 方法(注意;在原生平台上将抛出 UnimplementedError):

    // 在 Web 平台上禁用持久性

    await FirebaseAuth.instance.setPersistence(Persistence.NONE);
    

    更多信息:

    for more info:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2021-07-30
      • 2018-06-17
      • 2016-07-22
      • 2020-05-02
      • 1970-01-01
      • 2016-03-29
      相关资源
      最近更新 更多