Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Otentikasi dengan Firebase menggunakan Nomor Telepon dan C++

Anda dapat menggunakan Firebase Authentication untuk membuat pengguna login dengan mengirimkan pesan SMS ke ponsel pengguna. Pengguna masuk menggunakan kode satu kali yang terdapat dalam pesan SMS.

Dokumen ini menjelaskan cara menerapkan alur masuk dengan nomor telepon menggunakan SDK Firebase.

Sebelum kamu memulai

  1. Tambahkan Firebase ke proyek C++ Anda .
  2. Jika Anda belum menghubungkan aplikasi ke proyek Firebase, lakukan dari Firebase console .

Pada platform Apple, perhatikan bahwa masuk dengan nomor telepon memerlukan perangkat fisik dan tidak akan berfungsi pada simulator.

Perhatian pada keamanan

Otentikasi hanya menggunakan nomor telepon, meskipun nyaman, kurang aman dibandingkan metode lain yang tersedia, karena kepemilikan nomor telepon dapat dengan mudah ditransfer antar pengguna. Selain itu, pada perangkat dengan beberapa profil pengguna, setiap pengguna yang dapat menerima pesan SMS dapat masuk ke akun menggunakan nomor telepon perangkat.

Jika Anda menggunakan proses masuk berbasis nomor telepon di aplikasi Anda, Anda harus menawarkannya bersama dengan metode masuk yang lebih aman, dan memberi tahu pengguna tentang pengorbanan keamanan menggunakan masuk dengan nomor telepon.

Aktifkan masuk dengan Nomor Telepon untuk proyek Firebase Anda

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

  1. Di Firebase console , buka bagian Otentikasi .
  2. Pada halaman Metode Masuk , aktifkan metode masuk Nomor Telepon .

Kuota permintaan masuk nomor telepon Firebase cukup tinggi sehingga sebagian besar aplikasi tidak akan terpengaruh. Namun, jika Anda perlu masuk dengan volume pengguna yang sangat tinggi dengan autentikasi telepon, Anda mungkin perlu meningkatkan paket harga Anda. Lihat halaman harga .

Mulai menerima pemberitahuan APN (platform Apple)

Untuk menggunakan autentikasi nomor telepon di platform Apple, aplikasi Anda harus dapat menerima notifikasi APN dari Firebase. Saat Anda memasukkan pengguna dengan nomor telepon mereka untuk pertama kalinya di perangkat, Firebase Authentication mengirimkan pemberitahuan push diam ke perangkat untuk memverifikasi bahwa permintaan masuk dengan nomor telepon berasal dari aplikasi Anda. (Untuk alasan ini, masuk dengan nomor telepon tidak dapat digunakan di simulator.)

Untuk mengaktifkan notifikasi APN untuk digunakan dengan Firebase Authentication:

  1. Di Xcode, aktifkan pemberitahuan push untuk proyek Anda.
  2. Unggah sertifikat APN Anda ke Firebase. Jika Anda belum memiliki sertifikat APN, pastikan untuk membuatnya di Pusat Anggota Pengembang Apple .

    1. Di dalam proyek Anda di Firebase console, pilih ikon roda gigi, pilih Pengaturan Proyek , lalu pilih tab Pesan Awan .

    2. Pilih tombol Unggah Sertifikat untuk sertifikat pengembangan, sertifikat produksi, atau keduanya. Setidaknya satu diperlukan.

    3. Untuk setiap sertifikat, pilih file .p12, dan berikan kata sandi, jika ada. Pastikan ID paket untuk sertifikat ini cocok dengan ID paket aplikasi Anda. Pilih Simpan .

Kirim kode verifikasi ke ponsel pengguna

Untuk memulai proses masuk dengan nomor telepon, berikan antarmuka kepada pengguna yang meminta mereka untuk memberikan nomor telepon mereka, lalu panggil PhoneAuthProvider::VerifyPhoneNumber untuk meminta Firebase mengirimkan kode autentikasi ke ponsel pengguna melalui SMS:

  1. Dapatkan nomor telepon pengguna.

    Persyaratan hukum berbeda-beda, tetapi sebagai praktik terbaik dan untuk menetapkan harapan bagi pengguna Anda, Anda harus memberi tahu mereka bahwa jika mereka menggunakan login melalui telepon, mereka mungkin menerima pesan SMS untuk verifikasi dan tarif standar berlaku.

  2. Hubungi PhoneAuthProvider::VerifyPhoneNumber , dengan memberikan 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) mengirimkan pemberitahuan push diam ke aplikasi Anda,
    • mengirim pesan SMS yang berisi kode otentikasi ke nomor telepon yang ditentukan dan meneruskan ID verifikasi ke fungsi penyelesaian Anda. Anda akan memerlukan kode verifikasi dan ID verifikasi untuk memasukkan pengguna.
  3. Simpan ID verifikasi dan pulihkan saat aplikasi Anda dimuat. Dengan melakukannya, Anda dapat memastikan bahwa Anda masih memiliki ID verifikasi yang valid jika aplikasi Anda dihentikan sebelum pengguna menyelesaikan alur masuk (misalnya, saat beralih ke aplikasi SMS).

    Anda dapat mempertahankan ID verifikasi dengan cara apa pun yang Anda inginkan. Jika Anda menulis dengan kerangka kerja C++ lintas platform, itu akan memberikan pemberitahuan untuk penghentian dan pemulihan aplikasi. Pada acara ini, Anda dapat menyimpan dan memulihkan, masing-masing, ID verifikasi.

Jika panggilan ke VerifyPhoneNumber mengakibatkan OnCodeSent dipanggil pada Pendengar Anda, Anda dapat meminta pengguna untuk mengetikkan kode verifikasi saat mereka menerimanya dalam pesan SMS.

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

Masuk pengguna dengan kode verifikasi

Setelah pengguna memberikan kode verifikasi kepada aplikasi Anda dari pesan SMS, login pengguna dengan membuat objek Credential dari kode verifikasi dan ID verifikasi dan meneruskan objek itu ke Auth::SignInWithCredential .

  1. Dapatkan kode verifikasi dari pengguna.
  2. Buat objek Credential dari kode verifikasi dan ID verifikasi.
    Credential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. Masuk pengguna 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 selanjutnya

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

  • Di aplikasi, Anda bisa mendapatkan informasi profil dasar pengguna dari 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();
    }
    
  • Di Aturan Keamanan Firebase Realtime Database dan Cloud Storage , Anda bisa mendapatkan ID pengguna unik pengguna yang masuk dari variabel auth , dan menggunakannya untuk mengontrol data apa yang dapat diakses pengguna.

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

Untuk mengeluarkan pengguna, panggil SignOut() :

auth->SignOut();