【问题标题】:Does Firebase Auth Log me out when I use the reload function?当我使用重新加载功能时,Firebase Auth 会注销我吗?
【发布时间】:2021-02-15 01:28:41
【问题描述】:

我使用了 Firebase 手机身份验证,验证后,我想更新登录用户的个人资料详细信息。所以我写了一个云函数来做这件事,然后在函数返回响应后调用user.reload()方法。但令我惊讶的是,我的应用程序在我的控制台上被注销了:

[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] 未处理的异常:[firebase_auth/user-token-expired] 用户的凭据不再有效。用户必须重新登录。

我做了一些研究,发现这是一种安全措施,所以我不得不重新验证用户身份。

这就是我所做的:

 Future<Response> updateUserprofile({context, name, email}) async{

    User _user = _firebaseAuth.currentUser;

    Response response = Response(success: false);
    Provider.of<AuthenticationProvider>(context, listen: false).loading = true;

    try{
      HttpsCallableResult functionResponse  = await createUser.call({'displayName': name, 'email':email});
      response.success = functionResponse.data['success'];
      response.message = functionResponse.data['message'];
      
      _user.reload();

      AuthCredential credential = AuthCredential(providerId: PhoneAuthProvider.PROVIDER_ID, signInMethod: PhoneAuthProvider.PHONE_SIGN_IN_METHOD);
      await user.reauthenticateWithCredential(credential);

      Provider.of<AuthenticationProvider>(context, listen: false).loading = false;

      return response;
    }catch(e){
      Provider.of<AuthenticationProvider>(context, listen: false).loading = false;
      response.message = e.message;
      return response;
    }
  }

但我的控制台上仍然出现同样的错误:

[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] 未处理的异常:[firebase_auth/user-token-expired] 用户的凭据不再有效。用户必须重新登录。

【问题讨论】:

    标签: flutter firebase-authentication google-cloud-functions


    【解决方案1】:

    您正在更新用户的电子邮件。这会使 Firebase ID 令牌失效,如下所述:https://firebase.google.com/docs/auth/admin/manage-sessions

    这似乎是这里也指出的预期行为:Firebase Auth - After updating the user's email, Firebase Auth logs out the user。我知道这也是你想要做的?

    如果 user.reload() 返回该异常,那么如果您之前调用它,它仍然会返回:

    AuthCredential credential = AuthCredential(providerId: PhoneAuthProvider.PROVIDER_ID, signInMethod: PhoneAuthProvider.PHONE_SIGN_IN_METHOD);
          await user.reauthenticateWithCredential(credential);
    

    也许您应该在重新加载用户之前重新进行身份验证?


    我注意到的另一件事是您使用createUser.call。既然要更新现有用户的凭据,为什么不使用updateUser (https://firebase.google.com/docs/auth/admin/manage-users#update_a_user)?

    【讨论】:

    • 我在重新加载之前重新验证了用户身份,它第一次工作但它不再工作了。我仍然遇到同样的问题
    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 2020-08-10
    • 2013-04-29
    • 2019-08-12
    • 2021-01-15
    • 2018-08-24
    • 2018-01-17
    • 2021-07-30
    相关资源
    最近更新 更多