在 Flutter Web 中长时间使用 Firebase 后退出

Posted

技术标签:

【中文标题】在 Flutter Web 中长时间使用 Firebase 后退出【英文标题】:Firebase gets logged out after long time in Flutter Web 【发布时间】: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 被调用并且用户没有登录?

【问题讨论】:

【参考方案1】:

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

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

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

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

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

更多信息:

for more info:

【讨论】:

以上是关于在 Flutter Web 中长时间使用 Firebase 后退出的主要内容,如果未能解决你的问题,请参考以下文章

如何通过使用flutter bloc从fire存储中使用依赖注入来处理错误`The getter was called on null`

Flutter:Fire Base 存储图像上传的后期初始化错误

我是 Flutter Web 的新手,如何使用 Firebase 电话身份验证对用户进行身份验证,有没有办法让用户保持登录状态?

OwinCommunicationListener 中托管的 Async Web Api 中的 Fire and Forget 方法

Flutter iOS 不使用 pod

如何在flutter的firestore中使用uid更新用户数据