Buka konsol

Melakukan Autentikasi dengan Firebase Menggunakan Nomor Telepon dan C++

Anda dapat menggunakan Firebase Authentication untuk membuat pengguna login dengan mengirim pesan SMS ke ponselnya. Selanjutnya, pengguna login menggunakan kode sekali pakai yang dikirimkan dalam pesan SMS.

Dokumen ini berisi penjelasan mengenai cara mengimplementasikan proses login dengan nomor telepon menggunakan Firebase SDK.

Sebelum memulai

  1. Tambahkan Firebase ke project C++ Anda.

  2. Jika Anda belum menghubungkan aplikasi ke project Firebase, lakukanlah dari Firebase console.

Pada iOS, harap diperhatikan bahwa login dengan nomor telepon memerlukan perangkat fisik dan tidak akan berfungsi pada simulator.

Masalah keamanan

Autentikasi hanya melalui nomor telepon, meski nyaman, kurang aman dibandingkan metode lain yang tersedia, karena nomor tersebut dapat berpindah tangan antara pengguna dengan mudah. Selain itu, pada perangkat yang memuat beberapa profil pengguna, setiap pengguna yang dapat menerima pesan SMS dapat login ke akun menggunakan nomor telepon perangkat tersebut.

Jika Anda menggunakan fitur login dengan nomor telepon di aplikasi, Anda harus menawarkannya bersama metode login yang lebih aman, dan memberi tahu pengguna tentang kelemahan keamanan jika menggunakan metode login dengan nomor telepon.

Mengaktifkan login dengan Nomor Telepon untuk project Firebase

Untuk membuat pengguna login melalui SMS, Anda harus mengaktifkan metode login dengan Nomor Telepon untuk project Firebase terlebih dahulu:

  1. Di Firebase console, buka bagian Authentication.
  2. Di halaman Metode Login, aktifkan metode login dengan Nomor Telepon.

Kuota permintaan login dengan nomor telepon di Firebase cukup tinggi, sehingga sebagian besar aplikasi tidak akan terpengaruh. Namun, jika Anda perlu membuat banyak sekali pengguna login dengan autentikasi telepon, Anda mungkin harus mengupgrade paket harga. Lihat halaman harga.

Mulai menerima notifikasi APN (iOS)

Untuk menggunakan autentikasi nomor telepon di iOS, aplikasi Anda harus dapat menerima notifikasi APN dari Firebase. Saat Anda membuat pengguna login dengan nomor teleponnya untuk pertama kalinya di perangkat, Firebase Authentication akan mengirimkan notifikasi push senyap ke perangkat untuk memverifikasi bahwa permintaan login dengan nomor telepon tersebut berasal dari aplikasi Anda. (Karena alasan inilah, metode login dengan nomor telepon tidak dapat digunakan pada simulator.)

Untuk mengaktifkan notifikasi APN agar dapat digunakan dengan Firebase Authentication:

  1. Di Xcode, aktifkan notifikasi push untuk project Anda.
  2. Upload sertifikat APN Anda ke Firebase. Jika Anda belum memiliki sertifikat APN, lihat Menyediakan Sertifikat SSL APN.

    1. Di dalam project Anda dalam Firebase console, pilih ikon roda gigi, pilih Setelan Project, kemudian pilih tab Cloud Messaging.

    2. Pilih tombol Upload Sertifikat untuk sertifikat development, sertifikat produksi, atau keduanya. Anda harus memilih setidaknya satu dari keduanya.

    3. Untuk masing-masing sertifikat, pilih file .p12, dan masukkan sandi jika ada. Pastikan ID paket untuk sertifikat ini cocok dengan ID paket dari aplikasi Anda. Pilih Simpan.

Mengirim kode verifikasi ke ponsel pengguna

Untuk memulai metode login dengan nomor telepon, perlihatkan antarmuka yang akan meminta pengguna memasukkan nomor telepon, lalu panggil PhoneAuthProvider::VerifyPhoneNumber untuk meminta agar Firebase mengirimkan kode autentikasi ke ponsel pengguna melalui SMS:

  1. Dapatkan nomor telepon pengguna.

    Persyaratan hukum dapat berbeda-beda, namun sebagai praktik terbaik dan untuk menetapkan ekspektasi bagi pengguna, sebaiknya beri tahukan bahwa jika mereka menggunakan metode login melalui ponsel, mereka akan menerima pesan SMS untuk verifikasi dan tarif standar berlaku.

  2. Gunakan PhoneAuthProvider::VerifyPhoneNumber untuk meneruskan nomor telepon pengguna.
    class PhoneListener : public PhoneAuthProvider::Listener {
     public:
      ~PhoneListener() override {}
    
      void OnVerificationCompleted(Credential credential) override {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // No need for the user to input the verification code manually.
        // `credential` can be used instead of calling GetCredential().
      }
    
      void OnVerificationFailed(const std::string& error) override {
        // Verification code not sent.
      }
    
      void OnCodeSent(const std::string& verification_id,
                      const PhoneAuthProvider::ForceResendingToken&
                          force_resending_token) override {
        // Verification code successfully sent via SMS.
        // Show the Screen to enter the Code.
        // Developer may want to save that verification_id along with other app states in case
        // the app is terminated before the user gets the SMS verification code.
      }
    };
    
    PhoneListener phone_listener;
    PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth);
    phone_provider->VerifyPhoneNumber(phone_number, kAutoVerifyTimeOut, null,
                                      &phone_listener);
    
    Saat Anda memanggil PhoneAuthProvider::VerifyPhoneNumber, Firebase
    • (di iOS) akan mengirimkan notifikasi push senyap ke aplikasi Anda.
    • akan mengirimkan pesan SMS yang berisi kode autentikasi ke nomor telepon yang ditentukan dan meneruskan ID verifikasi ke fungsi penyelesaian Anda. Baik kode verifikasi maupun ID verifikasi diperlukan untuk membuat pengguna login.
  3. Simpan ID verifikasi dan pulihkan saat aplikasi Anda dimuat. Dengan begitu, dapat dipastikan bahwa Anda masih memiliki ID verifikasi valid jika aplikasi dihentikan sebelum pengguna menyelesaikan proses login (misalnya, saat beralih ke aplikasi SMS).

    Anda dapat mempertahankan ID verifikasi dengan cara apa pun sesuai keinginan. Jika Anda menulis dengan framework C++ lintas platform, notifikasi harus diberikan untuk menghentikan dan memulihkan aplikasi. Dalam peristiwa ini, Anda dapat menyimpan dan memulihkan ID verifikasi.

Jika panggilan ke VerifyPhoneNumber menyebabkan pemanggilan OnCodeSent di Listener, Anda dapat meminta pengguna untuk mengetik kode verifikasi yang mereka terima dalam pesan SMS.

Di sisi lain, jika panggilan ke VerifyPhoneNumber menghasilkan OnVerificationCompleted, maka verifikasi otomatis telah berhasil. Sekarang Anda akan memiliki Credential yang dapat digunakan seperti dijelaskan di bawah ini.

Membuat pengguna login dengan kode verifikasi

Setelah pengguna memasukkan kode verifikasi untuk aplikasi Anda yang diterimanya melalui SMS, buat pengguna login dengan membuat objek Credential dari kode dan ID verifikasi, lalu teruskan objek tersebut ke Auth::SignInWithCredential.

  1. Dapatkan kode verifikasi dari pengguna.
  2. Buat objek Credential dari kode dan ID verifikasi.
    Credential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. Buat pengguna login dengan objek Credential:
    Future<User*> future = auth_->SignInWithCredential(credential);
    future.OnCompletion(
        [](const Future<User*>& result, void*) {
          if (result.error() == kAuthErrorNone) {
            // Successful.
            // User is signed in.
            const User* user = *result.result();
    
            // This should display the phone number.
            printf("Phone number: %s", user->phone_number().c_str());
    
            // The phone number provider UID is the phone number itself.
            printf("Phone provider uid: %s", user->uid().c_str());
    
            // The phone number providerID is 'phone'
            printf("Phone provider ID: %s", user->provider_id().c_str());
          } else {
            // Error.
            printf("Sign in error: %s", result.error_message().c_str());
          }
        },
        nullptr);
    

Langkah berikutnya

Setelah pengguna login untuk pertama kalinya, akun pengguna baru akan dibuat dan dihubungkan ke kredensial—yaitu, nama pengguna dan sandi, nomor telepon, atau informasi penyedia autentikasi—yang digunakan pengguna tersebut untuk login. Akun baru ini disimpan sebagai bagian dari project Firebase Anda dan dapat digunakan untuk mengidentifikasi pengguna di setiap aplikasi dalam project Anda, terlepas dari cara pengguna login.

  • Pada aplikasi, Anda dapat memperoleh informasi profil dasar pengguna dari objek firebase::auth::User:

    firebase::auth::User* user = auth->current_user();
    if (user != nullptr) {
      std::string name = user->display_name();
      std::string email = user->email();
      std::string photo_url = user->photo_url();
      // The user's ID, unique to the Firebase project.
      // Do NOT use this value to authenticate with your backend server,
      // if you have one. Use firebase::auth::User::Token() instead.
      std::string uid = user->uid();
    }
    
  • Dalam Aturan Keamanan Firebase Realtime Database dan Cloud Storage, Anda dapat memperoleh ID unik milik pengguna yang login dari variabel auth dan menggunakannya untuk mengontrol data yang dapat diakses pengguna.

Anda dapat mengizinkan pengguna untuk login ke aplikasi Anda menggunakan beberapa penyedia autentikasi dengan menautkan kredensial penyedia autentikasi ke akun pengguna yang ada.

Agar pengguna logout, panggil SignOut():

auth->SignOut();