如何使用 Firebase 身份验证监听电子邮件验证事件并做出本机反应?

new*_*der 9 firebase react-native firebase-authentication

编辑-这个问题仍然没有答案。有一个想法可以听onIdTokenChanged,但是令牌每小时刷新一次,这对我来说不是实际的解决方案。我在这里发布了后续问题,如果人们可以帮助我的话,我会得到帮助,因为我已经坐了一个星期了这个问题。

我正在编写一个简单的反应本机应用程序,并且我想仅在用户验证其电子邮件后才显示我的主页。据我了解,没有侦听器可以用来侦听用户已验证其电子邮件的事件。我正在使用firebase.auth().onAuthStateChanged((user) => {....}),但侦听器onAuthStateChanged是在用户登录或注册后调用的,而不是在用户验证其电子邮件后调用的。建议使用很少的地方,firebase.auth().user.reload()以便它将重新加载当前用户并从数据库中获取验证状态。但是,我不认为这是一个解决方案,因为我不知道何时应该重新加载当前用户,即我不知道何时单击验证链接。所以这个问题的可能解决方案是:

  1. 向用户发送6位确认码,并等待用户在应用程序中输入;用户输入后,如果代码相同,我会刷新用户。但是我不知道如何使用 firebase 发送自定义验证电子邮件。我检查了文档,但这对我没有帮助。如果有人可以向我指出用 React Native 编写的示例,或者使用自定义电子邮件编写一个小型工作示例,我可以将其发送给用户(再次使用 React Native),那么我会同意的!编辑- 这似乎不是可能的解决方案,因为 Firebase 不允许您自定义电子邮件
  2. 我是否可以覆盖 onAuthStateChanged 侦听器?如果用户的电子邮件已通过验证或未验证,它会侦听更改吗?如果这是一个好主意,有人可以向我指出onAuthStateChangedreact-native中当前的实现,这样我就可以在覆盖时将其视为“灵感”吗?或者如果有人以前做过类似的事情,你能给我举个例子吗?
  3. 我已经阅读了一些使用深层链接并在单击链接时中断事件的建议,但我不确定如何执行此操作,或者即使这是问题的正确解决方案。
  4. firebase.auth().user.reload()有些人建议在应用程序关闭并重新打开时使用。这是基于这样的假设:当向用户发送链接时,为了让他们单击该链接,他们需要关闭应用程序,然后再次重新打开它。我认为这是一个非常强有力的假设,考虑到他们可能通过笔记本电脑验证他们的电子邮件并且永远不会关闭应用程序,所以我认为这也不是一个好的解决方案。

显然,这似乎是一个众所周知的问题,但没有太多好的解决方案。我认为最好的解决方案是向用户发送 6 位验证码,确认该代码后,我将重新加载当前用户,选择该字段emailVerified,它将设置为 true,然后我将显示主屏幕。但是,有人可以帮助我如何在 React Native 和 Firebase 中发送自定义电子邮件吗?

如果有人有任何其他建议,请告诉我!

Tim*_*uki 6

您只需在 actionCodeSettings 中传递一个 continue url 即可完成此操作,如下所示:

const res = await firebase.auth().createUserWithEmailAndPassword(
  email,
  password
);  
await res.user.sendEmailVerification({
  url: "https://yoursite.com/continue-url"
});
Run Code Online (Sandbox Code Playgroud)


Her*_*o H 2

sendEmailVerification()因此,在我的项目中,我将和结合起来reload()

尝试一下:

await firebase
        .auth()
        .currentUser.sendEmailVerification(actionCodeSettings)
        .then(() => {
          //useState used on my loading (user can cancel this loading and exit               this task
          setTextContent('Waiting for verification. Check your email!\nYou can close this verification and came back later');
          const unsubscribeOnUserChanged = firebase
            .auth()
            .onUserChanged(response => {
               const unsubscribeSetInterval = setInterval(() => {//this works as a next in for-like
                  firebase.auth().currentUser.reload();
               }, 30000);
              if (response.emailVerified) {
                 clearInterval(unsubscribeSetInterval); //stop setInterval
                setLoading(false); //close loading describes above
                navigation.goBack(); //return to parent (in my case to profile)
                return unsubscribeOnUserChanged(); //unsubscribe onUserChanged
              } 
            });
        })
        .catch(error => {
          setLoading(false); 
          setError(true);
          errorHandle(error);
        });
Run Code Online (Sandbox Code Playgroud)