Аутентификация номера телефона без отправки смс в Firebase на Android - PullRequest
0 голосов
/ 05 апреля 2020

Я хочу использовать аутентификацию по номеру телефона Firebase. Мой код такой:

LoginActivity.kt

import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.tasks.Task
import com.google.firebase.FirebaseException
import com.google.firebase.auth.AuthResult
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.PhoneAuthCredential
import com.google.firebase.auth.PhoneAuthProvider
import kotlinx.android.synthetic.main.login_activity.*
import java.util.concurrent.TimeUnit


class LoginActivity : AppCompatActivity() {
    lateinit var mCallbacks: PhoneAuthProvider.OnVerificationStateChangedCallbacks
    lateinit var mAuth: FirebaseAuth
    var verificationId = ""
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.login_activity)
        mAuth = FirebaseAuth.getInstance()
        veriBtn.setOnClickListener {
            if (phnNoTxt.text.toString()!=""){
            progress.visibility = View.VISIBLE
            verify ()}
                else toast("Enter verification number")
        }
        authBtn.setOnClickListener {
            if ((verifiTxt.text.toString()!="")&&(phnNoTxt.text.toString()!="")){
            progress.visibility = View.VISIBLE
            authenticate()}
            else toast("Enter phone number and its verification number")
        }
    }
    private fun verificationCallbacks () {
        mCallbacks = object: PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            override fun onVerificationCompleted(credential: PhoneAuthCredential) {
                progress.visibility = View.INVISIBLE
                signIn(credential)
                Log.d("abc","1")
            }
            override fun onVerificationFailed(p0: FirebaseException) {
                progress.visibility=View.GONE
                Log.d("abc","2")}
            override fun onCodeSent(verfication: String, p1: PhoneAuthProvider.ForceResendingToken) {
                super.onCodeSent(verfication, p1)
                verificationId = verfication
                progress.visibility = View.INVISIBLE
                Log.d("abc","3")
            }
        }
    }
    private fun verify () {
        verificationCallbacks()
        val phnNo ="+"+ phnNoTxt.text.toString()

        PhoneAuthProvider.getInstance().verifyPhoneNumber(
            phnNo,
            60,
            TimeUnit.SECONDS,
            this,
            mCallbacks
        )
    }
    private fun signIn (credential: PhoneAuthCredential) {
        mAuth.signInWithCredential(credential)
            .addOnCompleteListener {
                    task: Task<AuthResult> ->
                if (task.isSuccessful) {
                    toast("Sign in Successfully :)")
                }
            }
    }
    private fun authenticate () {

        val verifiNo = verifiTxt.text.toString()

        val credential: PhoneAuthCredential = PhoneAuthProvider.getCredential(verificationId, verifiNo)

        signIn(credential)

    }
    private fun toast (msg: String) {
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show()
    }

}

login_activity. xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_gravity="center"
    xmlns:android="http://schemas.android.com/apk/res/android">
            <EditText
                android:id="@+id/phnNoTxt"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:hint="Phone Number"
                android:inputType="number"
                android:textAlignment="center"
                android:textSize="24sp"
                android:gravity="center_horizontal" />

            <EditText
                android:id="@+id/verifiTxt"
                android:text=""
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentStart="true"
                android:textAlignment="center"
                android:inputType="number"
                android:layout_below="@+id/phnNoTxt"
                android:hint="Verification Code"
                android:gravity="center_horizontal"
                android:layout_alignParentLeft="true" />
            <ProgressBar
                android:id="@+id/progress"
                style="?android:attr/progressBarStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:visibility="gone" />

            <Button
                android:id="@+id/veriBtn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/verifiTxt"
                android:layout_centerHorizontal="true"
                android:layout_gravity="center"
                android:text="Verify" />

            <Button
                android:id="@+id/authBtn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/veriBtn"
                android:layout_centerHorizontal="true"
                android:layout_gravity="center"
                android:text="Authenticate" />
        </LinearLayout>
</ScrollView>

Когда я впервые ввожу свой номер телефона, Firebase отправляет мне SMS, фактически в verificationCallbacks (), будет запущен третий (onCodeSent). После этого, когда я снова введу свой номер телефона, в verificationCallbacks (), будет запущен первый (onVerificationCompleted). Это рационально. Но для меня странно, что после того, как я удалил код подтверждения SMS со своего телефона и удалил свой номер телефона из Firebase, хотя я ожидал, что Firebase отправит мне SMS и (onCodeSent) запустится, но снова (onVerificationCompleted) запустился. Когда я тестировал в другом телефоне, он работал как мне нравится. Каждый раз, когда я вводил свой номер телефона (в другом телефоне, а не в телефоне, в котором находится моя сим-карта), Firebase отправляла мне SMS с кодом и аутентифицировала мой номер телефона, если код был правильным. Я хочу, чтобы Firebase отправляла мне SMS-сообщения каждый раз, когда я ввожу свой номер телефона, либо я пробую его в телефоне, в котором находится моя сим-карта, либо в другом телефоне. Является ли это возможным? Как мне изменить мой код?

1 Ответ

1 голос
/ 05 апреля 2020

Кажется, нет способа сделать это без смс. Даже в документах Firebase упоминается, что это будет сделано через SMS, отправив код. А как бы вы проверили код без смс? Номер телефона не является собственностью вашего устройства android. Это где-то с вашим оператором. Даже если вам удастся получить номер телефона в строке и создать свой собственный способ проверки номера телефона, он не будет безопасным и может быть неправильно использован reverser-engineering.

Это упоминается в документации.

onCodeAutoRetrievalTimeOut (Идентификатор строки) Необязательно. Этот метод вызывается после истечения времени ожидания, указанного для verifyPhoneNumber, без инициирования onVerificationCompleted первым. На устройствах без SIM-карт этот метод вызывается немедленно, поскольку автоматическое получение SMS невозможно.

Теперь вернемся к topi c, это возможно, но во время тестирования. Вы можете внести в белый список номера, и OTP или код по SMS не будут отправлены. Однако для этого есть некоторые условия. https://firebase.google.com/docs/auth/android/phone-auth#test -with-whitelisted-phone-numbers

Во-вторых, у вас, похоже, возникла проблема, при которой вы удалили номер телефона, но база данных по-прежнему работала onVerificationCmoplete. Попробуйте удалить пользователя на вкладке «Аутентификация» и обновить его. И если ваш код отслеживает номер телефона или данные пользователя, связанные с этим номером, убедитесь, что вы также очистили его.

...