由于Firebase身份验证流程而产生的循环依赖性

时间:2019-05-21 18:49:07

标签: reactjs firebase react-native react-redux firebase-authentication

我正在构建一个使用Firebase进行身份验证的React Native应用。之所以会出现此问题,是因为Firebase在创建帐户后会自动登录用户,这会导致设置用户数据时出现问题。

Firebase建议使用onAuthStateChanged回调来观察用户登录和注销的时间。之所以会出现周期,是因为我需要在创建帐户后设置用户的本地Redux状态,但是onAuthStateChanged在创建用户后立即运行,并在创建之前触发用户状态的加载。

当用户登录或重新启动应用程序时,我需要加载他们存储在数据库中的现有帐户信息。这要求在loadUserLocal回调注意到身份验证状态更改后的某个时刻触发onAuthStateChanged方法,但这似乎与创建新用户的方式发生冲突。 onAuthStateChanged回调基本上在用户的新帐户具有其初始数据集之前劫持了导致调用loadUserLocal的过程。

在我看来,解决此问题的最简单方法是,在创建新帐户之后,我可以避免Firebase的自动登录,但是我能找到的唯一方法相当复杂,并且涉及{{3} }。这似乎有些矫kill过正。

我尝试解决的其他方法最终多次调用loadUserLocal,基本上忽略了第一个无用的调用,因为尚未保存数据。

signUp方法如下:

export async function signUp(dispatch, email, password) {
  const userData = {
    <...initial user data is set here...>
  }

  await auth.createUserWithEmailAndPassword(email, password)
  await saveUserLocal(userData)
  setUserData(dispatch, userData)
}

出现问题是因为auth.createUserWithEmailAndPassword方法在onAuthStateChanged有机会运行之前触发了saveUserLocal方法。身份验证的更改导致loadUserLocalsaveUserLocal之前被调用,因此userData不包含必要的信息。

我想出了避免这种情况的方法,但是随后我遇到了登录和刷新过程的问题。他们都需要触发对loadUserLocal的调用才能为现有用户检索必要的信息。每当我尝试一种方法来解决其中一个问题时,其他方法似乎都无法解决。一切似乎都与Firebase在用户创建后强制登录这一事实有关,这意味着我无法在用户登录之前设置用户的帐户数据并需要该数据。在使用Firebase创建用户之前,我曾尝试保存用户的帐户详细信息,但是要保存他们的信息,我需要Firebase创建的用户UID。这导致了与以前相同的依赖周期。

0 个答案:

没有答案