我在带有RNFirebase库的React Native项目中使用Firebase。我正在尝试在入职期间获取用户电话号码。最初使用电子邮件/密码注册后,获取电话号码的流程为:
firebase.auth().verifyPhoneNumber(phoneNumber)
输入并发送电话号码因此我的组件中有两种方法:sendCode
将代码发送到所提供的电话号码,而verifyCode
将输入的代码与发送的代码进行比较。
sendCode = () => {
const { phoneNumber } = this.state
firebase.auth()
.verifyPhoneNumber(phoneNumber)
.on('state_changed', (phoneAuthSnapshot) => {
switch (phoneAuthSnapshot.state) {
case firebase.auth.PhoneAuthState.CODE_SENT:
// This ends up creating a NEW user instead of adding phone number to the current user
firebase.auth().signInWithPhoneNumber(phoneNumber)
.then(confirmResult => this.setState({ confirmResult }))
.catch(err => {console.log('some other error:', err)})
break;
case firebase.auth.PhoneAuthState.ERROR:
console.log(phoneAuthSnapshot.error);
break;
}
}, (error) => {
console.log(error);
}, (phoneAuthSnapshot) => {
console.log(phoneAuthSnapshot);
})
}
verifyCode = () => {
const { codeInput, confirmResult } = this.state;
if (confirmResult && codeInput.length) {
confirmResult.confirm(codeInput)
.then(user => {
console.log(user);
})
.catch(err => {console.log('error verifying code:', err)})
}
}
在this example之后,我可以发送验证码,但是Promise返回对象和对象而不是函数,我需要在verifyCode
中验证该代码。
该示例建议使用firebase.auth().signInWithPhoneNumber(phoneNumber)
,然后返回一个用于确认代码的函数。由于创建了 new 身份验证用户,而不是将电话号码添加到当前用户,因此效果不佳。另一个问题是用户会遇到两个reCaptcha挑战,而不是一个...
有什么建议吗?
答案 0 :(得分:1)
这是我的两种工作方法,应将给定的电话号码链接到Facebook或电子邮件/密码验证。
verifyPhone: async phnumber => {
try {
let verify = await FirebaseAuth.auth()
.verifyPhoneNumber(phnumber)
.on("state_changed", phoneAuthSnapshot => {
switch (phoneAuthSnapshot.state) {
case FirebaseAuth.auth.PhoneAuthState.CODE_SENT:
return phoneAuthSnapshot;
break;
case FirebaseAuth.auth.PhoneAuthState.ERROR:
console.log(phoneAuthSnapshot.error);
return null;
break;
}
});
return verify;
} catch (error) {
console.log(error);
}
}
verifyPhone 函数将接受电话号码并返回包含您的VerificationId的对象。接下来是调用此函数,
processVerificationCode: async (verificationId, code) => {
try {
let credential = FirebaseAuth.auth.PhoneAuthProvider.credential(
verificationId,
code
);
let currentUser = FirebaseAuth.auth().currentUser;
return currentUser.linkWithCredential(credential);
} catch (error) {
console.log(error);
}
}
processVerificationCode 函数将接受2个参数VerificationId和inputedCode,然后调用PhoneAuthProvider获取电话号码凭据。接下来是获取当前登录的用户(假设您已有登录名),然后从该用户调用linkWithCredential并传递您的电话号码凭据。
就这样。希望对您有所帮助。