【发布时间】: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 被调用并且用户没有登录?
【问题讨论】:
标签: firebase firebase-authentication flutter-web hummingbird