Номер телефона с аутентификацией по паролю с использованием Firebase - PullRequest
4 голосов
/ 20 июня 2019

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

Теперь настоящая боль в том, что Мой пользователь может войти в систему с помощью номера телефона или идентификатора электронной почты, но для идентификатора электронной почты пользователь должен ввести пароль, а для номера телефона ему потребуется OTP. (Я попробовал это, ввел номер телефона и пароль для signInWithEmailAndPassword(), но не работал)

Я хотел, чтобы пользователь вошел по электронной почте или по телефону с паролем. как это делает Flipkart.

Есть ли способ, которым я могу справиться с этим?

Ответы [ 3 ]

3 голосов
/ 27 июня 2019

Создать облачную функцию со следующим кодом

const functions = require('firebase-functions');
const firebase = require('firebase');
const admin = require('firebase-admin');

admin.initializeApp();
firebase.initializeApp({
    //Add config for web-app here
    //Required because Admin SDK doesn't include signInWithEmailAndPassword method
});

exports.signInWithPhoneAndPassword = functions.https.onCall(async (data, context) => {
    const phoneNumber = data.phone;
    if (phoneNumber === undefined) {
        return {'s':400,'m':'Bad argument: no phone number'};
    }
    const user = await admin.auth().getUserByPhoneNumber(phoneNumber);
    const pass = data.password;
    try {
        await firebase.auth().signInWithEmailAndPassword(user.email, pass);
    } catch (e) {
        return {'s':400,'m':'Wrong password'};
    }
    const token = await admin.auth().createCustomToken(user.uid, {'devClaim':true}); //developer claims, optional param
    return {'s':200,'t':token};
});

На стороне клиента вызовите эту функцию, и если она возвращает объект с "s"==200, используйте токен с signInWithCustomToken ( Вызов облачной функции из Androidчерез Firebase )

3 голосов
/ 27 июня 2019

В настоящее время эта функция не существует.

Однако, есть способы, которые вы можете импровизировать и все же достичь этого.Вот мое предложение:

Во-первых, когда пользователь создает учетную запись, вам нужно создать отдельный список в вашей базе данных исключительно для сопоставления писем с телефонными номерами.Ваша БД может выглядеть так:

enter image description here

Таким образом, у вас есть полный список электронных писем и связанных с ними телефонных номеров.

Теперь на этапе входа в систему сделайте следующее:

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

  • Если пользователь ввел электронное письмо, перейдите к подходу signInWithEmailAndPassword().

  • Если пользователь ввел номер телефона, проверьте базу телефонных номеров в вашем списке FirebaseDatabase и получите оттуда письмо.После получения электронного письма выполните signInWithEmailAndPassword() и передайте полученное электронное письмо, а также пароль, введенный пользователем.

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

Я действительно надеюсь, что это поможет, веселое кодирование !!

1 голос
/ 02 июля 2019

Аутентификация телефона Firebase использует OTP.Таким образом, нет необходимости запоминать пароль для пользователя.После аутентификации вы будете зарегистрированы.Код OTP действует как пароль.Тем не менее, если вы хотите настроить метод аутентификации, firebase предоставляет возможность настроить метод аутентификации https://firebase.google.com/docs/auth/android/custom-auth

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