要求重试最佳做法

时间:2020-07-30 21:08:18

标签: android flutter firebase-authentication graphql refresh-token

我正在使用带有NodeJS API的Flutter,GraphQL和Firebase构建应用程序。 在我的应用程序中,我实现了Firebase身份验证和令牌刷新,而我的nodejs api对其进行了验证。 我的令牌刷新间隔为3500秒(其中令牌有效期为3600)。但是在某些情况下(我不知道为什么),我将应用程序打开半天后,我开始收到来自令牌验证的消息,我必须刷新令牌(不确定如何捕获它,因为在测试间隔刷新时,它只是可以工作)很好)...

那么刷新应用程序中令牌的最常用方法是什么?也许应用程序会在不活动和刷新计时器停止时自动休眠?如果是,那么我应该使用什么事件来捕获应用程序再次激活?

谢谢

p.s。经过一些研究,我意识到间隔刷新令牌有什么问题-当电话处于活动状态时,刷新间隔可以正常工作。如果我锁定手机,屏幕时间间隔将停止。再次听完电话后,时间间隔将从BEGINNING重新开始。这里出现了主要问题-由于FB令牌有效期为1个小时,因此有99%的用户将其电话屏幕转为,并在他再次将其打开后,计时器将从头开始启动-但令牌将过期...

您知道在手机/应用再次激活后触发的任何颤动事件吗?

3 个答案:

答案 0 :(得分:1)

任何OAuth客户端中的绝对黄金法则是实现以下行为:

  • 如果您从API获得401
  • 尝试获取一个新的访问令牌-仅一次
  • 重试API调用-仅一次

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)

所以研究之后,我最终用两个步骤解决了它。

  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);
     }
    }
    
  1. ,并在main.dart中恢复应用时重新获取令牌

    @override
    Future<void> didChangeAppLifecycleState(AppLifecycleState state) async {
         super.didChangeAppLifecycleState(state);
         if (state == AppLifecycleState.resumed) {
             await _authService.refreshToken();
         }
     }