Phone Auth 的 Firebase OnAuthStateChanged 即使是 iOS 也会触发

Firebase OnAuthStateChanged for Phone Auth fires even for iOS

我目前正在开发一个移动应用程序,其中 Firebase 用于 Android 和 iOS.Also 的 OTP 服务必须提到我正在使用 react native 和 redux。

问题背景

我正在为 firebase 函数使用 react-native-firebase 库。正如文档所说,对于 Android,我们可以使用 OnAuthStateChanged 来识别用户已使用 google 服务登录。但是对于iOS,这是不可能的。

问题

但对我来说,每当我使用 phone OTP 登录时,即使使用 iOS 设备,它也会自动让我登录。所以这是个问题。

我做了什么

下面是我使用phone登录的代码部分。

firebase.auth().signInWithPhoneNumber(phoneNumber).then(confirmResult =>{
    firebase.auth().onAuthStateChanged((user) => {
          if (user) {
                console.log('Auto signed in')
              })
        }
   })
}).catch(error => {console.log(error)})

所以使用 console.log,我检查了这是否真的适用于 iOS。当我输入 phone 号码并输入时,我会自动在调试器控制台中使用 Auto Signed in 消息登录。所以这实际上适用于 iOS。还必须提到上面的代码部分是在 redux 动作内部。如果用户经过验证,所有调度 (Redux thunk) 都会发生。

然后我只需要在收到 OTP 时验证它是否有效。但即使我输入随机 phone 号码(当前手机未使用),用户登录时甚至没有收到 OTP。

真题

即使用户没有收到 OTP SMS,这个 OnAuthStateChange 也会触发。这是一个大问题。我在这里做错了什么?如何解决这个问题?

我在使用 onAuthStageChanged 函数时遇到过类似的问题。但是我猜这是因为你从 signInWithPhoneNumber 内部调用了 onAuthStageChanged

只要您使用给定的 phone 号码成功登录,就会调用 onAuthStageChanged 函数。但是坦率地说,我没有很好地解释这个执行是如何在 if(user) 内部进行的。无论如何,我假设因为您已经登录并尝试检查该应用程序。

因此,即使用户从未成功登录,由于 onAuthStageChanged 函数调用,登录成功函数也会启动。您可以使用以下代码片段进行检查。 (顺便说一句,我不太熟悉 thunk)

export const sampleFunc = () =>{
    firebase.auth().onAuthStateChanged((user) => {
          if (user) {
            console.log('User signed in with just action call')
          })
        }
    })
     return(dispatch)=>{
       // Required dispatches.
    }
}

因此,从您的 class 调用上述函数,您将在控制台中看到 User signed in with just action call,即使没有任何身份验证阶段更改。

因此,我所做的是,只需从您的 class 中的 ComponentDidMount 调用 onAuthStateChanged 函数。所以很明显用户在组件安装时没有签名。然后,从 if(user) 内部调用所需的操作来保存数据并在登录成功后移动到主屏幕。

现在,当您收到消息时,

iOS

onAuthStateChanged 不会像 firebase 所说的那样被触发。所以 iOS 应该遵循基本的 OTP 输入屏幕并从那里进行验证。

Android

使用 Google Play 服务,它将自动识别传入的消息,并将执行必要的任务来触发 onAuthStateChanged 功能。然后因为ComponentDidMount已经初始化了onAuthStateChanged,这将被触发并自动登录用户。