我目前正在开发一个移动应用程序,其中Firebase用于Android和iOS的OTP服务。还必须提到我正在使用带有Redux的react native。
问题背景
我正在将react-native-firebase
库用于firebase函数。如文档所述,对于Android,我们可以使用OnAuthStateChanged
来标识已使用Google服务登录的用户。但是对于iOS,这是不可能的。
问题
但是对我来说,每当我使用手机OTP登录时,即使使用iOS设备,它也会自动登录。所以这是一个问题。
我做什么
下面是我使用电话登录的代码部分。
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。当我输入电话号码并输入时,我会在调试器控制台中自动以Auto Signed in
消息登录。因此,这实际上适用于iOS。还必须提到上面的代码部分是在redux动作内部。如果验证了用户,则所有调度(Redux重击)都会发生。
然后,我需要验证此方法仅在收到OTP时有效。但是,即使我输入了随机电话号码(当前手机不使用该电话号码),用户登录也没有收到OTP。
实际问题
即使用户未收到OTP SMS,此OnAuthStateChange
也会触发。这是一个很大的问题。我在这里做什么错了?如何解决这个问题?
答案 0 :(得分:1)
我在onAuthStageChanged
函数中遇到了类似的问题。但是我猜想是因为您从onAuthStageChanged
内部调用signInWithPhoneNumber
。
只要您成功使用给定的电话号码登录,就会调用onAuthStageChanged
功能。但是坦率地说,我对如何在if(user)
内执行此执行没有很好的解释。无论如何,我认为由于您已经登录了以前尝试检查该应用程序的尝试。
因此,即使没有成功登录用户,登录成功功能也会因onAuthStageChanged
函数调用而启动。您可以使用以下代码段进行检查。 (我对thunk btw不太熟悉)
export const sampleFunc = () =>{
firebase.auth().onAuthStateChanged((user) => {
if (user) {
console.log('User signed in with just action call')
})
}
})
return(dispatch)=>{
// Required dispatches.
}
}
因此从您的类中调用上述函数,即使未更改任何身份验证阶段,您也将在控制台中看到User signed in with just action call
。
因此,我要做的就是从类中的ComponentDidMount调用onAuthStateChanged
函数。因此很明显,在安装组件时,用户未签名。然后,从if(user)
内部调用成功登录后所需的操作,以保存数据并移至主屏幕。
现在,当您收到消息时,
iOS
onAuthStateChanged
不会像Firebase所说的那样被触发。因此,iOS应该遵循基本的OTP输入屏幕并从那里进行验证。
Android
使用Google Play服务,它将自动识别传入的消息,并将执行必要的任务以触发onAuthStateChanged
功能。然后,因为ComponentDidMount
已经初始化了onAuthStateChanged
,它将被触发并自动登录用户。