使用重新加载功能时,Firebase Auth是否注销我?

时间:2020-11-02 11:31:12

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

我使用了Firebase电话身份验证,经过验证后,我想更新已登录用户的个人资料详细信息。因此,我编写了一个云函数来执行此操作,然后在该函数返回响应后调用user.reload()方法。但是令我惊讶的是,我的应用程序在我的控制台上注销了:

[错误: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;
    }
  }

但是我在控制台上仍然遇到相同的错误:

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

1 个答案:

答案 0 :(得分: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。由于您要更新现有用户的凭据,为什么不使用updateUserhttps://firebase.google.com/docs/auth/admin/manage-users#update_a_user)?