【问题标题】:Flutter Firebase Auth - Catching expired tokenFlutter Firebase Auth - 捕获过期令牌
【发布时间】:2021-01-05 10:02:16
【问题描述】:

我正在使用 Firebase Auth 插件对我的 Flutter 应用进行身份验证。

直到升级到最新的 Firebase 身份验证版本(不确定是否相关):

firebase_core: ^0.5.0
firebase_auth: ^0.18.0+1

一切正常。

现在我第一次遇到 Sentry 错误:

FirebaseAuthException: [firebase_auth/user-token-expired] The user's credential is no longer valid. The user must sign in again.
  File "exception.dart", line 20, in catchPlatformException
  File "zone.dart", line 1198, in _rootRunUnary
  File "zone.dart", line 1100, in _CustomZone.runUnary
  File "future_impl.dart", line 160, in _FutureListener.handleError
  File "future_impl.dart", line 708, in Future._propagateToListeners.handleError
  File "future_impl.dart", line 729, in Future._propagateToListeners
  File "future_impl.dart", line 537, in Future._completeError
  File "async_patch.dart", line 47, in _AsyncAwaitCompleter.completeError
  File "platform_channel.dart", in MethodChannel.invokeMapMethod
  File "<asynchronous suspension>"
  File "unparsed"

怎么会这样?用户说,他有几天没用这个应用程序了。据我了解 Firebase 身份验证文档,身份验证令牌会自动使用刷新令牌进行刷新。

如何缓解这个问题?

我在哪里/如何捕获此异常以将用户重定向到登录屏幕?

【问题讨论】:

    标签: firebase flutter firebase-authentication


    【解决方案1】:

    你可以做几件事,

    第一

    当用户启动您的应用程序时,您应该首先检查用户是否已经登录,如果是,则静默登录,如果没有,则将用户发送到登录页面,下面是一个示例我四个月前构建的应用程序(您必须将 google_sign_in 依赖项添加到您的应用程序)

    class _StartingPageState extends State<StartingPage> {
    
      Future<dynamic> decideStartingPage() async {
        bool isUserSignedIn  = await googleSignIn.isSignedIn();
    
        if (isUserSignedIn == true) {
          FirebaseUser futurefbuser =await getCurrentFirebaseUser();
          assignFireBaseUser(futurefbuser);
          await googleSignIn.signInSilently();
          return HomeTabView();
        }
        else
          return LoginPage();
      }
    
      Future<dynamic> startingpage;
    
      @override
      void initState(){
        super.initState();
        startingpage=decideStartingPage();
        FirebaseAdMob.instance.initialize(appId: "ca-app-pub-...........");
      }
    
       @override
      Widget build(BuildContext context) {
        return FutureBuilder(
          future:startingpage,
          builder: (BuildContext ctx, AsyncSnapshot<dynamic> snapshot) {
            if (snapshot.connectionState != ConnectionState.done) {
              return Center( child : const CircularProgressIndicator());
            }
            else
              return snapshot.data;
          }
        );
      }
    }
    
    

    第二:

    您可以做的第二件事是保存用户登录时获得的访问令牌和(或)刷新令牌,当过期时,您可以使用刷新令牌获得另一个访问令牌。这意味着您需要做一些额外的工作,因为您必须将令牌保存在共享首选项或 json 文件中。

    现在在哪里添加处理上述过程的代码?您必须确定只有经过身份验证的用户才能做的第一件事,例如写入数据库,您的应用程序很可能会抛出异常,因为该用户未通过该操作进行身份验证。使用 try、catch,最后您可以再次登录用户,而无需用户执行任何操作。欲了解更多信息,请访问this

    在第一种情况下,用户需要再次显式登录,第二种方法需要额外的工作,但对用户来说更方便。选择权在你。

    【讨论】:

    • 你觉得它有帮助吗
    猜你喜欢
    • 2019-08-08
    • 2019-12-17
    • 2019-12-11
    • 2018-03-04
    • 2021-04-04
    • 2020-04-01
    • 2017-10-19
    • 2021-02-06
    • 1970-01-01
    相关资源
    最近更新 更多