RN / Firebase:将电话凭证与现有帐户关联

时间:2018-08-03 10:56:54

标签: firebase authentication react-native firebase-authentication

我在带有RNFirebase库的React Native项目中使用Firebase。我正在尝试在入职期间获取用户电话号码。最初使用电子邮件/密码注册后,获取电话号码的流程为:

  1. 使用firebase.auth().verifyPhoneNumber(phoneNumber)输入并发送电话号码
  2. 接收验证码并确认
  3. 如果成功,则将电话号码添加到当前的身份验证用户

因此我的组件中有两种方法: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挑战,而不是一个...

有什么建议吗?

1 个答案:

答案 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并传递您的电话号码凭据。

就这样。希望对您有所帮助。