当用户离线时,Firebase 身份验证会话会持续多长时间?
Posted
技术标签:
【中文标题】当用户离线时,Firebase 身份验证会话会持续多长时间?【英文标题】:How long does a Firebase Auth session last when the user is offline? 【发布时间】:2021-03-31 11:50:44 【问题描述】:我的应用程序在 Flutter 上,我正在使用离线持久性,因为我的用户最多可以停留 4 小时,然后才能再次连接互联网。我读过刷新令牌是长期存在的,理论上“永不过期”,但是在我的测试中,我注意到 ios 和 android 会话之间存在很大差异:
我正在做的测试如下:
-
我通过 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 时显示错误?