那么刷新应用程序中令牌的最常用方法是什么?也许应用程序会在不活动和刷新计时器停止时自动休眠?如果是,那么我应该使用什么事件来捕获应用程序再次激活?
谢谢
p.s。经过一些研究,我意识到间隔刷新令牌有什么问题-当电话处于活动状态时,刷新间隔可以正常工作。如果我锁定手机,屏幕时间间隔将停止。再次听完电话后,时间间隔将从BEGINNING重新开始。这里出现了主要问题-由于FB令牌有效期为1个小时,因此有99%的用户将其电话屏幕转为,并在他再次将其打开后,计时器将从头开始启动-但令牌将过期...
您知道在手机/应用再次激活后触发的任何颤动事件吗?
答案 0 :(得分:1)
任何OAuth客户端中的绝对黄金法则是实现以下行为:
Some sample Android code of mine that does this。
该要求是通用的,无论使用何种客户端或技术。在我自己的应用中,我从未读过令牌到期,而只是让401发生。这是一种有弹性的解决方案,因为401的发生可能有多种原因。
我建议首先关注需求,然后再关注技术
答案 1 :(得分:0)
Firebase Auth将每小时或根据需要自动刷新用户的ID令牌。您不必为此编写任何代码。
Android,iOS和JS库都提供了一种侦听ID令牌更改的方法,但是Flutter显然没有公开此API。但是,您仍然可以定期调用getIdToken(false)来获取当前的ID令牌。只是不要坚持太久而已。
答案 2 :(得分:-1)
所以研究之后,我最终用两个步骤解决了它。
使用以下代码初始化令牌的定期刷新:
void _handleAuthStateChanged(FirebaseUser e) async {
if (e == null) {
_authentication = null;
} else {
/// Get token
final firebaseToken = await e.getIdToken(refresh: true);
/// Setup token refresh
firebaseToken.expirationTime.asFuture(() async {
var user = await FirebaseAuth.instance.currentUser();
_handleAuthStateChanged(user);
});
extension DateTimeFutureX on DateTime {
Future<T> asFuture<T>([FutureOr<T> Function() computation]) async {
final difference = this.difference(DateTime.now());
return Future.delayed(difference, computation);
}
}
,并在main.dart中恢复应用时重新获取令牌
@override
Future<void> didChangeAppLifecycleState(AppLifecycleState state) async {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.resumed) {
await _authService.refreshToken();
}
}