Создайте аутентификацию по номеру мобильного телефона с помощью Firebase

В настоящее время параметры на веб-сайте Firebase ограничивают вас готовыми решениями для аутентификации пользователей через Facebook или электронную почту человека и т. д. Я хочу разрешить пользователю входить в систему и аутентифицироваться с использованием своего номера мобильного телефона, как это позволяет Snapchat.

Есть ли готовое решение для этого? Как это можно построить?


person Sauron    schedule 05.12.2016    source источник


Ответы (3)


Это в настоящее время не поддерживается. Аутентификация по номеру телефона — сложная функция для реализации с точки зрения конфиденциальности, безопасности и продукта. Тем не менее, если вы хотите создать его, вам придется реализовать собственный механизм для отправки SMS-сообщений с уникальным короткоживущим кодом (соответствующим выделенному uid для определенного номера телефона) пользователям, использующим такой сервис, как Twilio. Вы также должны защищаться от фишинговых атак со стороны приложений, пытающихся выдать себя за ваше приложение (на 3 поддерживаемых платформах) и обманом заставляющих пользователей вводить SMS-код в свое приложение. Не говоря уже о том, что вы должны защищаться от злоупотреблений (злоумышленников, отправляющих SMS-сообщения из вашего приложения). Наконец, когда пользователь выкупает код SMS, вы можете вернуть пользовательский токен (связанный с выделенным uid), который в настоящее время поддерживается Firebase admin sdk и signInWithCustomToken на стороне клиента, завершая процесс входа. Это все еще упрощение вопроса. Я предлагаю вам запросить эту функцию на форуме группы Firebase Google.

person bojeil    schedule 05.12.2016
comment
Спасибо, я знал, что это будет сложно. Учитывая готовое решение для работы с электронной почтой, я не думаю, что на данный момент существует какая-либо реальная ценность аутентификации по номеру телефона. - person Sauron; 06.12.2016
comment
Отличные новости! Аутентификация по номеру телефона теперь поддерживается в Firebase (iOS и Интернет, скоро появится Android): firebase.google.com/docs/auth/web/phone-auth - person bojeil; 19.05.2017

Это возможно. Но пока только для iOS/Web. Реализация для Android также должна быть выполнена в ближайшее время. Проверьте документы Firebase. https://firebase.google.com/docs/auth/web/phone-auth

person guyromb    schedule 07.06.2017

теперь телефонная аутентификация доступна в firebase. Вот код для телефонной аутентификации с использованием Firebase:

EditText phoneNum,Code;// two edit text one for enter phone number other for enter OTP code
Button sent_,Verify;  // sent button to request for verification and verify is for to verify code
private PhoneAuthProvider.ForceResendingToken mResendToken;
private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks;
private FirebaseAuth mAuth;
private String mVerificationId;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_phone_number_auth);// layout 


    phoneNum =(EditText) findViewById(R.id.fn_num);
    Code =(EditText) findViewById(R.id.code);

    sent_ =(Button)findViewById(R.id.sent_nu);
    Verify =(Button)findViewById(R.id.verify);

    callback_verificvation();                   ///function initialization

    mAuth = FirebaseAuth.getInstance();


    sent_.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String num=phoneNum.getText().toString();
            startPhoneNumberVerification(num);          // call function for receive OTP 6 digit code
        }
    });
    Verify.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String code=Code.getText().toString();
            verifyPhoneNumberWithCode(mVerificationId,code);     //call function for verify code 

        }
    });
}

private void startPhoneNumberVerification(String phoneNumber) {
    // [START start_phone_auth]
    PhoneAuthProvider.getInstance().verifyPhoneNumber(
            phoneNumber,        // Phone number to verify
            60,                 // Timeout duration
            TimeUnit.SECONDS,   // Unit of timeout
            this,               // Activity (for callback binding)
            mCallbacks);        // OnVerificationStateChangedCallbacks
    // [END start_phone_auth]


}

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information

                        FirebaseUser user = task.getResult().getUser();
                        Toast.makeText(getApplicationContext(), "sign in successfull", Toast.LENGTH_SHORT).show();
                        // [START_EXCLUDE]


                    } else {
                        // Sign in failed, display a message and update the UI

                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            // The verification code entered was invalid

                        }

                    }
                }
            });
}
private void verifyPhoneNumberWithCode(String verificationId, String code) {
    // [START verify_with_code]
    PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
    // [END verify_with_code]
    signInWithPhoneAuthCredential(credential);
}


private void callback_verificvation() {

    mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        @Override
        public void onVerificationCompleted(PhoneAuthCredential credential) {
            // This callback will be invoked in two situations:
            // 1 - Instant verification. In some cases the phone number can be instantly
            //     verified without needing to send or enter a verification code.
            // 2 - Auto-retrieval. On some devices Google Play services can automatically
            //     detect the incoming verification SMS and perform verificaiton without
            //     user action.
            // [START_EXCLUDE silent]


            // [START_EXCLUDE silent]

            signInWithPhoneAuthCredential(credential);
        }

        @Override
        public void onVerificationFailed(FirebaseException e) {
            // This callback is invoked in an invalid request for verification is made,
            // for instance if the the phone number format is not valid.
            // [START_EXCLUDE silent]


            if (e instanceof FirebaseAuthInvalidCredentialsException) {
                // Invalid request


                // [END_EXCLUDE]
            } else if (e instanceof FirebaseTooManyRequestsException) {
                // The SMS quota for the project has been exceeded

            }


        }

        @Override
        public void onCodeSent(String verificationId,
                               PhoneAuthProvider.ForceResendingToken token) {
            // The SMS verification code has been sent to the provided phone number, we
            // now need to ask the user to enter the code and then construct a credential
            // by combining the code with a verification ID.


            // Save verification ID and resending token so we can use them later
            mVerificationId = verificationId;
            mResendToken = token;


        }
    };
person Muhammad Naseer Subhani    schedule 09.07.2017
comment
Как войти в систему по номеру телефона? - person Kamlakar Kate; 22.08.2017
comment
В firebase есть только нажатие для входа в систему... в первый раз это будет работать как регистрация... в следующий раз как вход.... - person Muhammad Naseer Subhani; 22.08.2017
comment
Каждый раз он будет отправлять OTP для проверки? - person Kamlakar Kate; 22.08.2017
comment
Да... каждый раз, когда мы входим в систему... firebase отправляет OTP-код. - person Muhammad Naseer Subhani; 22.08.2017
comment
я думал это что-то вроде номера телефона и пароля - person Kamlakar Kate; 22.08.2017