如何将手机与邮箱/密码验证关联?

7 firebase firebase-authentication flutter

我正在尝试创建一个 flutter 应用程序,在其中使用电子邮件/密码创建用户后,将其保存在 firebase 中,然后用户输入发送 OTP 的电话号码,并在验证后登录。我的问题是,当这两个步骤完成后,Firebase 将创建两个单独的帐户,一个使用电子邮件,另一个使用手机。请告诉我如何使用电子邮件/密码和电话创建一个帐户。我还想使用电子邮件/密码或电话登录。或使用电子邮件/密码和电话创建用户的任何其他方式。

void _verifyPhoneNumber() async {
if (mounted)
  setState(() {
    _message = '';
  });
final PhoneVerificationCompleted verificationCompleted =
    (AuthCredential phoneAuthCredential) {
  _firebaseUser.updatePhoneNumberCredential(phoneAuthCredential);
  if (mounted)
    setState(() {
      _message = 'Received phone auth credential: $phoneAuthCredential';
    });
};

 final PhoneVerificationFailed verificationFailed =
    (AuthException authException) {
  showToast(authException.message,
      gravity: Toast.TOP, duration: Toast.LENGTH_LONG);
  if (mounted)
    setState(() {
      _isLoading = false;
      _message =
          'Phone number verification failed. Code: ${authException.code}. Message: ${authException.message}';
    });
};

final PhoneCodeSent codeSent =
    (String verificationId, [int forceResendingToken]) async {
  print('Please check your phone for the verification code.');
  _verificationId = verificationId;
  setState(() {
    _isLoading = false;
  });
  Navigator.of(context).pushReplacement(new MaterialPageRoute(
      builder: (BuildContext context) =>
          new VerifyOtp(_firebaseUser, verificationId)));
  };

 final PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout =
    (String verificationId) {
  _verificationId = verificationId;
};

await _firebaseAuth.verifyPhoneNumber(
    phoneNumber: phoneController.text,
    timeout: const Duration(minutes: 2),
    verificationCompleted: verificationCompleted,
    verificationFailed: verificationFailed,
    codeSent: codeSent,
    codeAutoRetrievalTimeout: codeAutoRetrievalTimeout);
}
Run Code Online (Sandbox Code Playgroud)

确认*

   final AuthCredential credential = PhoneAuthProvider.getCredential(
    verificationId: widget.verificationId,
    smsCode: otpController.text,
  );

await _firebaseAuth.signInWithCredential(credential).then((user) {

  }).catchError((error) {
    showToast(error.toString(),
        gravity: Toast.TOP, duration: Toast.LENGTH_LONG);

  });
Run Code Online (Sandbox Code Playgroud)

小智 6

 await _firebaseAuth.signInWithCredential(credential).then((user) {

}).catchError((error) {
  showToast(error.toString(),
    gravity: Toast.TOP, duration: Toast.LENGTH_LONG);

});
Run Code Online (Sandbox Code Playgroud)

只需将其替换为

firebaseUser.linkWithCredential(credential).then((user) {
    print(user.uid);
  }).catchError((error) {
    print(error.toString());
  });
Run Code Online (Sandbox Code Playgroud)

这对我来说是工作......