Xác thực số điện thoại bằng Firebase

Hôm nay chúng ta sẽ tìm hiểu cách sử dụng Firebase để xác thực số điện thoại bằng tin nhắn.

Setup

  • Đầu tiên chúng ta cần phải tạo mới một project trên Firebase Console để có thể sử dụng dịch vụ của firebase vào ứng dụng.

  • Sau khi đã tạo project và config trong ứng dụng, chúng ta sẽ thiết lập để kích hoạt chức năng năng cho việc xác thực.

Coding !

  • Tổng quan về ứng dụng của chúng ta sẽ có một màn hình để nhập số điện thoại và sau đó sẽ hiện dialog lên để người dùng nhập code như sau:

  • Để server firebase gửi tin nhắn đến người dùng, ta sẽ sử dụng phương thức verifyPhoneNumber trong instance PhoneAuthProvider và config các tham số như sau:
PhoneAuthProvider.getInstance().verifyPhoneNumber(
    "+84${editTextPhoneNumber.text}",
    120,
    TimeUnit.SECONDS,
    this,
    object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(phoneAuthCredential: PhoneAuthCredential?) {}

        override fun onVerificationFailed(firebaseException: FirebaseException?) {
            if (firebaseException is FirebaseTooManyRequestsException) {
                 Toast.makeText(applicationContext, "Too many request !", Toast.LENGTH_SHORT).show()
           }
        }

        override fun onCodeAutoRetrievalTimeOut(verificationId: String) {
            verifyId = verificationId
        }

        override fun onCodeSent(id: String, resendingToken: ForceResendingToken) {
            super.onCodeSent(id, resendingToken)
            verifyId = id
            token = resendingToken
        }
    }, token
)
  • Tham số đầu tiên: là Số điện thoại sẽ được nhận sms. Số điện thoại được sử dụng ở đây phải có mã vùng nên chúng ta cần thêm tiền tố +84 vào trước. Ví dụ: +849051234**
  • Tham số thứ 2: là thời gian TimeOut để nhận tin nhắn. Giá trị ở đây phải từ 0 - 120 seconds, nếu sau khoảng thời gian trên mà tin nhắn chưa được gửi thì nó trả lại call back cho mình.
  • Tham số thứ 3: TimeUnit - định nghĩa đơn vị thời gian
  • Tham số thứ 4: Activity
  • Tham số thứ 5: một abstract class chứa các callback trả về
  • Tham số cuối cùng: token Resend sms.

Ở đây ta sẽ chú ý vào 2 giá trị verifyIdtoken :

  • verifyId: Mỗi khi server gửi tin nhắn cho người dùng, nó sẽ trả lại cho chúng ta một id (không phải sms code). Giá trị id này sẽ được sử dụng kết hợp với sms code mà người dùng nhập để chúng ta có thể gửi lên server xác thực,
  • token: Mình cần lưu giá trị này lại để dùng cho trường hợp Resend.

Verify SMS Code

  • Sau khi người dùng nhận được tin nhắn và nhập sms code, ta sẽ lấy code từ người dùng kết hợp với verifyId ở trên để tạo ta object PhoneAuthCredential. Chúng ta sẽ sử dụng object này để sign-in và firebase sẽ trả lại callback cho ta.
val credential = PhoneAuthProvider.getCredential(verifyId!!, alertDialog.editTextSMSCode.text.toString())

FirebaseAuth.getInstance().signInWithCredential(credential)
            .addOnCompleteListener { task ->
                Toast.makeText(applicationContext, "Verified Successful !", Toast.LENGTH_SHORT).show()
            }
            .addOnFailureListener {
                Toast.makeText(applicationContext, "Verified failed !", Toast.LENGTH_SHORT).show()
            }

Chúc các bạn thành công !