当用户离线时,Firebase 身份验证会话会持续多长时间?

Posted

技术标签:

【中文标题】当用户离线时,Firebase 身份验证会话会持续多长时间?【英文标题】:How long does a Firebase Auth session last when the user is offline? 【发布时间】:2021-03-31 11:50:44 【问题描述】:

我的应用程序在 Flutter 上,我正在使用离线持久性,因为我的用户最多可以停留 4 小时,然后才能再次连接互联网。我读过刷新令牌是长期存在的,理论上“永不过期”,但是在我的测试中,我注意到 iosandroid 会话之间存在很大差异:

我正在做的测试如下:

    我通过 Internet 连接打开应用程序并继续进行身份验证过程(Firebase Auth 后面)。 我使用应用程序,然后激活离线模式 我最小化应用程序 我激活了飞行模式,所以设备没有互联网连接(离线模式) 稍后我会检查应用程序是否仍在会话中,以便我可以继续在离线模式下输入数据。

我目前得到的结果是:

在 IOS 上:

会话在离线模式下保持活动状态。我已经测试了 75 分钟、120 分钟,最后一次测试了 4 小时。我不能保证会话永远不会过期,但它似乎确实是持久的。

在 Android 上:

如果我在 25 分钟之前进入,会话将保持活动状态。

我可以在离线时保持会话处于活动状态,只要我每 25 分钟至少操作一次应用程序(我尝试了 5 个 25 分钟周期的序列)

如果已最小化并离线超过 30 分钟,它会再次要求我提供凭据(因为我处于离线状态,所以无法获取)

我的问题是:

1.操作系统为IOS或Android时,Firebase认证后离线会话时长有什么区别?

2。设备离线时 Firebase 身份验证会话持续多长时间是否有实际测量值?

3。有没有办法修改这个参数以获得更长的会话?我想要至少 12 小时,否则它永远不会过期。


附件:

测试设备:

IOS:Iphone X。IOS 版本 14.2

Android:三星 J2 Android 版本 8.1.0

颤振代码:

我使用提供程序对用户进行身份验证的方式如下:

class UsuarioProvider 
  final FirebaseAuth _firebaseAuth;
  DatabaseReference db = FirebaseDatabase.instance.reference();

  UsuarioProvider(FirebaseAuth firebaseAuth)
    : _firebaseAuth = firebaseAuth ?? FirebaseAuth.instance;

 Future <Map<String, dynamic>> signIn(String email, String password) async 
   
   try 
      UserCredential result = await FirebaseAuth.instance.signInWithEmailAndPassword(email: email, password: password);
      User user = result.user;
      return 'ok' : true, 'localId': user.uid, 'email' : user.email;
    catch (e) 
        print(e);
      return 'ok': false, 'code': '$e.code', 'mensaje': '$e.message' ; 
   
 

我用来调用firebase的方式是:

void main() async 
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  FirebaseDatabase database;
  database = FirebaseDatabase.instance;
  database.setPersistenceEnabled(true);
  database.setPersistenceCacheSizeBytes(10000000);
  runApp(MyApp());
 

【问题讨论】:

【参考方案1】:

当用户离线时,Firebase 身份验证会话会持续多长时间?

Firebase 身份验证基于两个令牌:一个永不过期的刷新令牌,以及一个在生成后一小时过期并由 SDK 自动刷新的 ID 令牌。

正如我对your previous question 的回答中所述,没有办法扩展 ID 令牌,因此如果用户离线,它将过期。因此,您应该从“它何时到期?”重新构建问题。到“当 ID 令牌过期时 SDK 会做什么?”


例如,当用户离线时,数据库 SDK 将继续处理读取和排队写入。当 ID 令牌过期时,if 甚至会继续这样做,因为 SDK 不会确定是否需要身份验证:数据库安全规则通常会这样做。

当与服务器的连接恢复时,数据库客户端会等待直到刷新 ID 令牌,然后才会将挂起的写入发送到服务器,以确保这些写入以最新的身份验证状态进行处理。


您的问题不是您的身份验证会话/ID 令牌过期,而是应用程序的某些部分或 Android 上的 SDK 要求用户重新输入他们的凭据。解决这个问题应该从找出提示来自哪里开始。

【讨论】:

嗯嗯嗯。如何识别提示来自哪里?试图弄清楚,我的主要已将“登录”定义为初始路由。可能由于某种原因,离线时 Android 调用 main 比 IOS 更频繁? 我不知道提示来自哪里。但是我认为您的#5的前提是错误的:“我稍后再检查App是否仍在会话中,以便我可以继续在离线模式下输入数据。”鉴于我在上面的描述,您应该能够在离线时继续写入数据库。你确定写操作是在提示出现的时候?您可以为此显示MCVE 吗? 不...不是写操作。该应用程序刚刚再次初始化(启动器),我看到登录屏幕而不是我所在的屏幕。 那么你能告诉我们这是怎么发生的吗?您如何确定要显示的屏幕?该流程中的哪些操作会导致提示? 请不要在 cmets 中提供代码,而是将此类信息放在您的问题中。

以上是关于当用户离线时,Firebase 身份验证会话会持续多长时间?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 离线支持:在用户离线时上传帖子,当用户在 iOS Swift 应用程序中在线时同步

离线时无法在颤振应用程序中使用signInWithEmailAndPassword

Firebase - 互联网离线时上传图片

如何在用户离线时尝试将数据添加/上传到 Firebase 时显示错误?

使用refreshToken颤动firebase自动刷新用户会话

离线设备上的 Firebase 云功能