当用户使用Firebase身份验证登录时,我正在使用共享首选项存储令牌,电子邮件,用户名和其他用户详细信息。 firebase令牌每隔一小时就会过期,因此我需要根据用户何时返回下面在getCurrentUser()
函数中正在执行的应用的时间来刷新令牌。我想知道,如果用户登录了我的应用程序,使用了5分钟左右,然后关闭了该应用程序,那么该计时器函数是否仍将在监听并在超时后调用该函数?
如果没有,那么我该如何检查呢?
void checkTokenValidity(int time) {
Timer(Duration(seconds: time), () async {
print('token timed out');
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('token', 'expired');
prefs.remove("currentUser");
});
}
Future<String> getCurrentUser() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
final String currentToken = prefs.getString('token');
final String cuser = prefs.getString('currentUser');
print("current: $cuser");
if (cuser != null && currentToken != 'expired') {
print('signed in and $currentToken');
SharedPreferences prefs = await SharedPreferences.getInstance();
String token = prefs.getString('token');
String uid = prefs.getString('userId');
String email = prefs.getString('userEmail');
String photo = prefs.getString('photo');
_authenticatedUser =
User(email: email, id: uid, token: token, photo: photo);
return 'success';
} else if (currentToken == 'expired') {
print('token is expired');
final FirebaseUser user = await FirebaseAuth.instance.signInAnonymously();
var token = await user.getIdToken();
prefs.setString('token', token);
String uid = prefs.getString('userId');
String email = prefs.getString('userEmail');
String photo = prefs.getString('photo');
_authenticatedUser =
User(id: uid, email: email, token: token, photo: photo);
checkTokenValidity(3600);
return 'token';
} else {
print('user is null');
return null;
}
}
在我不在这里的身份验证功能中,我在用户成功登录后立即调用checkTokenValidity(3600)
。
我也尝试使用FirebaseUser user = await FirebaseAuth.instance.currentUser();
,但这也不能解决问题。
答案 0 :(得分:0)
您走错了路。正确的方法是在401(未经授权)错误上添加错误处理程序,并通过刷新令牌并重试同一查询来处理错误。