当我使用重新加载功能时,Firebase Auth 会注销我吗?

Posted

技术标签:

【中文标题】当我使用重新加载功能时,Firebase Auth 会注销我吗?【英文标题】:Does Firebase Auth Log me out when I use the reload function? 【发布时间】: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] 用户的凭据不再有效。用户必须重新登录。

【问题讨论】:

【参考方案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)?

【讨论】:

我在重新加载之前重新验证了用户身份,它第一次工作但它不再工作了。我仍然遇到同样的问题

以上是关于当我使用重新加载功能时,Firebase Auth 会注销我吗?的主要内容,如果未能解决你的问题,请参考以下文章

当我更新 ListView 上的列表时,Flutter 页面不会重新加载

如何在反应应用程序中重新加载每个页面时停止 firebase re-auth()?

如何在不请求的情况下在firebase-auth中首次加载时获取currentUser

每次页面重新启动时,Firebase.auth().currentUser 都会变为 null

Firebase Auth State Persistence ELECTRON loadFILE vs loadURL

Firebase - 一小时后丢失身份验证会话