Firebase -Как проверить, существует ли номер телефона внутри телефона аутентификации, прежде чем создавать нового пользователя - PullRequest
0 голосов
/ 03 мая 2020

При использовании электронной почты при входе в систему нового пользователя или создании нового пользователя существует 2 разных метода подписи. При создании нового пользователя, если электронная почта уже существует, будет возвращена ошибка или при входе пользователя в систему, если электронная почта не существует, будет возвращена ошибка:

// create account
Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (authDataResult, error)

    if let error = error {

       // if this email address already exists an error will be returned
       return
    }
})

// login 
Auth.auth().signIn(withEmail: emailTextField.text!, password: self.passwordTextField.text!, completion: { (authDataResult, error) in

    if let error = error {

       // if this email address isn't inside the system then an error will be returned
       return
    }
})

Но при использовании номера телефона пользователя для войдите или создайте новую учетную запись. Я должен использовать одну и ту же сигнатуру метода для обеих ситуаций.

func loginExistingUserOrCreateNewOne(phoneNumber: String, verificationCode: String) {

    PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) { (verificationID, error) in

        if let error = error { return }

        guard let verificationId = verificationID else { return }

        let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationId, verificationCode: verificationCode)

        Auth.auth().signIn(with: credential, completion: { (authDataResult, error) in

            guard let authUser = authDataResult else { return }

            let checkUsersRef = Database.database().reference().child("users").child(authUser.user.uid)
            checkExistingUsersRef.observeSingleEvent(of: .value, with: { (snapshot) in

                if !snapshot.exists() {
                    // this is a new user, now add them to the users ref

                    let newUserDict = ["signupDate": Date().timeIntervalSince1970]
                    checkUsersRef.updateChildValues(newUserDict, withCompletionBlock: { (error, ref) in

                        if let error = error {

                            // because there is an error this ref was never updated so now I have to sign this user out and they have to start over agin
                            do {
                                try Auth.auth().signOut()

                            } catch let err as NSError {

                                // alert user there is a major problem
                            }
                            return
                        }

                        // if no error let them go to HomeVC
                    })

                    return
                }

                // this is a previous user fetch dict data and let them proceed to HomeVC
                guard let previousUserDict = snapshot.value as? [String: Any] else { return }

                // get newUserDict values and let them go to HomeVC
            })
        })
    }
}

Если у пользователя уже есть учетная запись, мне нужно получить некоторые данные от пользователя ref, а затем я позволю они переходят к HomeV C. Если пользователь никогда не регистрировался ранее, я должен добавить их в ссылку на пользователя и затем позволить им продолжить. Это двухэтапный процесс.

Проблема в том, что эти дополнительные шаги кажутся ненужными. Например, при использовании знака электронной почты или имени входа возвращается ошибка, поэтому нет необходимости создавать и проверять внутри другого ссылки, чтобы увидеть, существует ли это письмо.

Вне процесса, использованного в приведенном выше коде, Есть ли другой способ определить, существует ли номер телефона перед созданием новой учетной записи или его нет при входе в систему?

1 Ответ

0 голосов
/ 04 мая 2020

Вам потребуется использовать sdk администратора для поиска пользователя по номеру телефона :

admin.auth().getUserByPhoneNumber(phoneNumber)
  .then(function(userRecord) {
    // User exists.
  })
  .catch(function(error) {
    if (error.code === 'auth/user-not-found') {
      // User not found.
    }
  });

Вы можете использовать облачную функцию для размещения конечной точки HTTP. Поиск пользователя по номеру телефона возможен только через аутентифицированные API, работающие на стороне сервера (с использованием Firebase Admin SDK).

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