Как я могу связать телефон с электронной почтой / паролем? - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь создать приложение флаттера, в котором после создания пользователя с электронной почтой / паролем они сохраняются в базе данных, затем пользователь вводит свой номер телефона, на который отправляется 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);
}

Проверка *

   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);

  });

Ответы [ 2 ]

0 голосов
/ 02 июля 2019
 await _firebaseAuth.signInWithCredential(credential).then((user) {

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

});

Просто замените его на

firebaseUser.linkWithCredential(credential).then((user) {
    print(user.uid);
  }).catchError((error) {
    print(error.toString());
  });

Это работа для меня .....

0 голосов
/ 01 июля 2019

Вам необходимо связать провайдера аутентификации телефона с объектом пользователя firebase после входа в пароль электронной почты.https://firebase.google.com/docs/auth/android/account-linking. Поскольку вы непосредственно входите в систему, firebase будет рассматривать ее как новую регистрацию / регистрацию, создание новой учетной записи.

Возможно, вы добавляете аутентификацию телефона для пользователя на странице настроек вашего приложения,когда вы создали AuthCredential, просто наберите firebaseUser.linkWithCredential() эквивалент в флаттере, и он подключится к пользователю с аутентификацией телефона.

Вы можете проверить это с консоли Firebase, где логотип телефона и почты будут отображаться на электронной почте пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...