Melakukan Autentikasi dengan Firebase menggunakan Nomor Telepon pada Unity

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 menjelaskan cara mengimplementasikan proses login dengan nomor telepon menggunakan Firebase SDK.

Sebelum memulai

  1. Agar dapat menggunakan Firebase Authentication, Anda harus menambahkan Firebase Unity SDK (khususnya, FirebaseAuth.unitypackage) ke project Unity Anda.

    Temukan petunjuk detail seputar langkah-langkah penyiapan awal ini di artikel Menambahkan Firebase ke project Unity Anda.

  2. Jika belum menghubungkan aplikasi ke project Firebase, lakukanlah dari Firebase console.
  3. Pahami persyaratan platform untuk login dengan Nomor Telepon:
    • Login dengan Nomor Telepon hanya tersedia untuk platform seluler.
    • Pada iOS, login dengan Nomor Telepon memerlukan perangkat fisik dan tidak akan berfungsi pada simulator.

Masalah keamanan

Meskipun mudah, autentikasi hanya melalui nomor telepon kurang aman dibandingkan metode lain yang tersedia, karena nomor tersebut dapat berpindah tangan antarpengguna 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 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 memproses login pengguna 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 Sign-in Method, aktifkan metode login dengan Phone Number.

Kuota permintaan login dengan nomor telepon di Firebase cukup tinggi, sehingga sebagian besar aplikasi tidak akan terpengaruh. Namun, jika perlu memproses login pengguna dalam jumlah yang sangat besar menggunakan autentikasi dengan nomor telepon, Anda mungkin harus mengupgrade paket harga. Lihat halaman harga.

Mulai menerima notifikasi APNs (khusus iOS)

Untuk menggunakan autentikasi nomor telepon di iOS, aplikasi Anda harus dapat menerima notifikasi APNs dari Firebase. Saat Anda memproses login pengguna dengan nomor telepon untuk pertama kalinya di perangkat, Firebase Authentication akan mengirim notifikasi push diam ke perangkat untuk memverifikasi bahwa permintaan login dengan nomor telepon tersebut berasal dari aplikasi Anda. (Inilah sebabnya login dengan nomor telepon tidak bisa digunakan pada simulator).

Untuk mengaktifkan notifikasi APNs agar dapat digunakan dengan Firebase Authentication:

  1. Di Xcode, aktifkan notifikasi push untuk project Anda.
  2. Upload sertifikat APNs Anda ke Firebase. Jika Anda belum memiliki sertifikat APNs, pastikan untuk membuat sertifikat di Apple Developer Member Center.

    1. Pada project Anda di Firebase console, pilih ikon roda gigi, pilih Project Settings, kemudian pilih tab Cloud Messaging.

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

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

Mengirim kode verifikasi ke ponsel pengguna

Untuk memulai metode login dengan nomor telepon, tampilkan 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 demi menetapkan ekspektasi pengguna, sebaiknya beri tahukan bahwa jika mereka menggunakan metode login melalui telepon, akan muncul pesan SMS berisi permintaan verifikasi dan pemberlakuan tarif standar.

  2. Panggil PhoneAuthProvider.VerifyPhoneNumber, lalu teruskan PhoneAuthOptions yang berisi nomor telepon pengguna.
    PhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth);
    provider.VerifyPhoneNumber(
      new Firebase.Auth.PhoneAuthOptions {
        PhoneNumber = phoneNumber,
        TimeoutInMilliseconds = phoneAuthTimeoutMs,
        ForceResendingToken = null
      },
      verificationCompleted: (credential) => {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // There is no need to input the verification code.
        // `credential` can be used instead of calling GetCredential().
      },
      verificationFailed: (error) => {
        // The verification code was not sent.
        // `error` contains a human readable explanation of the problem.
      },
      codeSent: (id, token) => {
        // Verification code was successfully sent via SMS.
        // `id` contains the verification id that will need to passed in with
        // the code from the user when calling GetCredential().
        // `token` can be used if the user requests the code be sent again, to
        // tie the two requests together.
      },
      codeAutoRetrievalTimeout: (id) => {
        // Called when the auto-sms-retrieval has timed out, based on the given
        // timeout parameter.
        // `id` contains the verification id of the request that timed out.
      });
    
    Saat Anda memanggil PhoneAuthProvider.VerifyPhoneNumber, Firebase,
    • (di iOS), mengirimkan notifikasi push diam ke aplikasi Anda.
    • Firebase 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 memproses login pengguna.
  3. Simpan ID verifikasi dan pulihkan saat aplikasi 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. Cara mudahnya adalah dengan menyimpan ID verifikasi dengan UnityEngine.PlayerPrefs.

Jika callback yang diteruskan ke codeSent dipanggil, Anda dapat meminta pengguna untuk mengetik kode verifikasi yang mereka terima dalam pesan SMS.

Di sisi lain, jika callback untuk verificationCompleted dipanggil, verifikasi otomatis berhasil dan Anda akan memiliki PhoneAuthCredential yang dapat digunakan seperti yang dijelaskan di bawah.

Memproses login pengguna dengan kode verifikasi

Setelah pengguna memasukkan kode verifikasi yang diterima melalui SMS ke aplikasi Anda, proses login pengguna dengan membuat objek PhoneAuthCredential dari kode dan ID verifikasi, lalu teruskan objek tersebut ke FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync.

  1. Dapatkan kode verifikasi dari pengguna.
  2. Buat objek Credential dari kode verifikasi dan ID verifikasi.
    PhoneAuthCredential credential =
        phoneAuthProvider.GetCredential(verificationId, verificationCode);
        
  3. Proses login pengguna dengan PhoneAuthCredential objek:
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " +
                       task.Exception);
        return;
      }
    
      FirebaseUser newUser = task.Result.User;
      Debug.Log("User signed in successfully");
      // This should display the phone number.
      Debug.Log("Phone number: " + newUser.PhoneNumber);
      // The phone number providerID is 'phone'.
      Debug.Log("Phone provider ID: " + newUser.ProviderId);
    });
    

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.FirebaseUser:

    Firebase.Auth.FirebaseUser user = auth.CurrentUser;
    if (user != null) {
      string name = user.DisplayName;
      string email = user.Email;
      System.Uri photo_url = user.PhotoUrl;
      // 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 User.TokenAsync() instead.
      string uid = user.UserId;
    }
    
  • 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();