Melakukan Autentikasi dengan Firebase Menggunakan Sistem Autentikasi Kustom dan C++

Anda dapat mengintegrasikan Firebase Authentication dengan sistem autentikasi kustom, dengan cara memodifikasi server autentikasi Anda untuk menghasilkan token bertanda tangan kustom ketika pengguna berhasil login. Aplikasi Anda akan menerima token ini dan menggunakannya untuk melakukan autentikasi dengan Firebase.

Sebelum memulai

  1. Tambahkan Firebase ke project C++ Anda.
  2. Dapatkan kunci server project Anda:
    1. Buka halaman Service Accounts di setelan project Anda.
    2. Klik Generate New Private Key di bagian bawah Firebase Admin SDK pada halaman Service Accounts.
    3. Pasangan kunci umum/pribadi baru untuk akun layanan secara otomatis disimpan di komputer Anda. Salin file ini ke server autentikasi Anda.

Melakukan Autentikasi dengan Firebase

Class Auth adalah gateway untuk semua panggilan API.
  1. Tambahkan file header Auth dan App:
    #include "firebase/app.h"
    #include "firebase/auth.h"
  2. Pada kode inisialisasi Anda, buat class firebase::App.
    #if defined(__ANDROID__)
      firebase::App* app =
          firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity);
    #else
      firebase::App* app = firebase::App::Create(firebase::AppOptions());
    #endif  // defined(__ANDROID__)
  3. Dapatkan class firebase::auth::Auth untuk firebase::App Anda. Terdapat fungsi pemetaan one-to-one antara App dan Auth.
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
Panggil Auth::SignInWithCustomToken dengan token dari server autentikasi.
  1. Ketika pengguna login ke aplikasi Anda, kirimkan kredensial loginnya (misalnya, nama pengguna dan sandi) ke server autentikasi. Server Anda akan memeriksa kredensial dan menampilkan token kustom jika kredensial tersebut valid.
  2. Setelah Anda menerima token kustom dari server autentikasi, teruskan token tersebut ke Auth::SignInWithCustomToken agar pengguna dapat login:
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInWithCustomToken(custom_token);
  3. Jika program Anda memiliki loop pembaruan yang berjalan secara teratur (misalnya 30 atau 60 kali per detik), Anda dapat memeriksa hasilnya satu kali per pembaruan dengan Auth::SignInWithCustomTokenLastResult:
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInWithCustomTokenLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        firebase::auth::AuthResult auth_result = *result.result();
        printf("Sign in succeeded for `%s`\n",
               auth_result.user.display_name().c_str());
      } else {
        printf("Sign in failed with error '%s'\n", result.error_message());
      }
    }
    Atau, jika program Anda dikendalikan oleh peristiwa, Anda bisa memilih untuk mendaftarkan callback pada Future.

Langkah berikutnya

Setelah pengguna login untuk pertama kalinya, akun pengguna baru akan dibuat dan ditautkan 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, terlepas dari cara pengguna login.

  • Di aplikasi, Anda bisa mendapatkan informasi profil dasar pengguna dari objek firebase::auth::User:

    firebase::auth::User user = auth->current_user();
    if (user.is_valid()) {
      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 milik pengguna yang login dari variabel auth, dan menggunakannya untuk mengontrol data yang dapat diakses oleh pengguna.

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

Untuk memproses logout pengguna, panggil SignOut():

auth->SignOut();