如何解决在Flutter Web中长时间登录后,Firebase会注销
我正在开发一个Web应用程序,并将Firebase身份验证用于身份验证服务。
该项目似乎存储了身份验证,因为如果刷新页面或关闭浏览器,则用户仍处于登录状态。
但是我注意到,如果长时间不访问应用程序(例如,晚上超过1小时),身份验证就会丢失。
我不知道该如何调试以及如何解决。
遵循一些代码片段以更好地理解我的实现:
这是我在启动视图中具有的功能,用于根据身份验证状态将用户重定向到正确的页面。
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 SDK 提供开箱即用的支持,以确保您的用户的身份验证状态在应用重新启动或页面重新加载时保持不变。
在 Android 和 iOS 等原生平台上,此行为不可配置,用户的身份验证状态将在应用重新启动之间保留在设备上。用户可以通过设备设置清除应用程序缓存的数据,这将清除存储的任何现有状态。
在网络平台上,用户的身份验证状态存储在本地存储中。如果需要,您可以更改此默认行为以仅保留当前会话的身份验证状态,或者根本不保留。要配置这些设置,请调用 setPersistence() 方法(注意;在本机平台上将抛出 UnimplementedError):
// 在 Web 平台上禁用持久化
await FirebaseAuth.instance.setPersistence(Persistence.NONE);
了解更多信息:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。