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

时间:2020-12-21 17:39:00

标签: android ios flutter firebase-authentication

我的应用程序在 Flutter 上,我使用离线持久性,因为我的用户可以在重新连接互联网之前停留长达 4 小时。我已经读过刷新令牌是长期存在的,理论上“永不过期”,但是在我的测试中,我注意到 IOS 和 Android 会话之间存在很大差异:

我正在做的测试如下:

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

我目前得到的结果是:

在 IOS 上:

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

在安卓上:

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

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

如果它已经最小化并且离线超过 30 分钟,它会再次要求我提供凭据(因为我离线,这是不可能获得的)

我的问题是:

1.操作系统为IOS和Android时Firebase身份验证后离线会话的持续时间有何不同?

2.是否有实际衡量设备离线时 Firebase 身份验证会话持续多长时间的方法?

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


附件:

测试设备:

IOS:Iphone X。IOS 版本 14.2

安卓:三星 J2 安卓 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 个答案:

答案 0 :(得分:2)

<块引用>

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

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

正如我对 your previous question 的回答所述,无法扩展 ID 令牌,因此如果用户离线,它就会过期。因此,您应该从“什么时候到期?”重新定义这个问题。到“当 ID 令牌过期时 SDK 会做什么?”


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

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


您的问题不在于您的身份验证会话/ID 令牌已过期,而是应用的某些部分或 Android 上的 SDK 要求用户重新输入其凭据。解决此问题应该从弄清楚该提示的来源开始。