Membuat jenis akun kustom

Sejauh ini kita telah membahas cara mengakses Google API, yang menggunakan akun dan pengguna yang ditentukan oleh Google. Namun, jika Anda memiliki layanan online sendiri, layanan tersebut tidak akan memiliki akun atau pengguna Google, jadi apa yang Anda lakukan? Ternyata menginstal jenis akun baru di perangkat pengguna relatif mudah. Tutorial ini menjelaskan cara membuat jenis akun kustom dengan cara kerja yang sama seperti akun bawaan.

Menerapkan kode akun kustom

Hal pertama yang Anda perlukan adalah cara mendapatkan kredensial dari pengguna. Caranya mungkin semudah kotak dialog yang meminta nama dan sandi. Atau mungkin prosedur yang lebih rumit seperti sandi sekali pakai atau pemindaian biometrik. Apa pun itu, Anda bertanggung jawab untuk menerapkan kode yang:

  1. Mengumpulkan kredensial dari pengguna
  2. Mengautentikasi kredensial dengan server
  3. Menyimpan kredensial di perangkat

Biasanya ketiga persyaratan ini dapat ditangani oleh satu aktivitas. Kita menyebutnya sebagai aktivitas otentikator.

Karena perlu berinteraksi dengan sistem AccountManager, aktivitas pengautentikasi memiliki persyaratan tertentu yang tidak dapat dilakukan oleh aktivitas normal. Untuk memudahkan Anda melakukannya dengan benar, framework Android menyediakan class dasar, AccountAuthenticatorActivity, yang dapat diperluas untuk membuat pengautentikasi kustom Anda sendiri.

Cara Anda memenuhi dua persyaratan pertama aktivitas pengautentikasi, yaitu pengumpulan kredensial dan autentikasi, sepenuhnya terserah Anda. (Seandainya hanya ada satu cara untuk melakukannya, tentunya tidak perlu ada jenis akun "khusus".) Persyaratan ketiga memiliki implementasi kanonis, dan agak sederhana:

Kotlin

Account(username, your_account_type).also { account ->
    accountManager.addAccountExplicitly(account, password, null)
}

Java

final Account account = new Account(username, your_account_type);
accountManager.addAccountExplicitly(account, password, null);

Menangani keamanan dengan cerdas

Penting untuk dipahami bahwa AccountManager bukan layanan enkripsi atau keychain. Fitur ini menyimpan kredensial akun persis seperti yang Anda teruskan, dalam teks biasa. Di sebagian besar perangkat, hal ini bukan masalah khusus karena data disimpan dalam database yang hanya dapat diakses oleh root. Namun pada perangkat yang telah di-root, kredensial akan dapat dibaca oleh siapa saja yang memiliki akses adb ke perangkat.

Mengingat hal ini, Anda tidak boleh meneruskan sandi pengguna yang sebenarnya ke AccountManager.addAccountExplicitly(). Sebagai gantinya, Anda harus menyimpan token yang aman secara kriptografis yang tidak banyak berguna bagi penyerang. Jika kredensial pengguna Anda melindungi sesuatu yang berharga, sebaiknya pertimbangkan untuk melakukan hal serupa dengan cermat.

Ingat: Dalam hal kode keamanan, ikuti aturan "Mythbuster": jangan mencoba sendiri di rumah! Hubungi tenaga profesional keamanan sebelum menerapkan kode akun kustom apa pun.

Sekarang, setelah penafian keamanan siap, saatnya melanjutkan bekerja. Anda telah menerapkan inti kode akun kustom; yang tersisa adalah pemipaan.

Memperluas AbstractAccountAuthenticator

Agar AccountManager berfungsi dengan kode akun kustom, Anda memerlukan class yang mengimplementasikan antarmuka yang diharapkan AccountManager. Class ini disebut class pengautentikasi.

Cara termudah untuk membuat class pengautentikasi adalah dengan memperluas AbstractAccountAuthenticator dan mengimplementasikan metode abstraknya. Jika Anda telah menyelesaikan tutorial sebelumnya, metode abstrak AbstractAccountAuthenticator seharusnya sudah tidak asing lagi: keduanya adalah sisi kebalikan dari metode yang Anda panggil di tutorial sebelumnya untuk mendapatkan informasi akun dan token otorisasi.

Untuk menerapkan class pengautentikasi dengan benar, diperlukan sejumlah bagian kode terpisah. Pertama, AbstractAccountAuthenticator memiliki tujuh metode abstrak yang harus Anda ganti. Kedua, Anda perlu menambahkan filter intent untuk "android.accounts.AccountAuthenticator" ke manifes aplikasi Anda (ditampilkan di bagian berikutnya). Terakhir, Anda harus menyediakan dua resource XML yang menentukan, antara lain, nama jenis akun kustom Anda dan ikon yang akan ditampilkan oleh sistem di samping akun jenis ini.

Anda dapat menemukan panduan langkah demi langkah agar dapat menerapkan class pengautentikasi dan file XML yang berhasil dalam dokumentasi AbstractAccountAuthenticator.

Jika aktivitas pengautentikasi Anda memerlukan parameter inisialisasi khusus, Anda dapat menambahkannya ke intent menggunakan Intent.putExtra().

Membuat layanan pengautentikasi

Setelah memiliki class pengautentikasi, Anda memerlukan tempat untuk class tersebut. Pengautentikasi akun harus tersedia untuk beberapa aplikasi dan berfungsi di latar belakang. Jadi, pengautentikasi akun harus berjalan di dalam Service. Kita menyebutnya layanan otentikator.

Layanan pengautentikasi Anda bisa sangat sederhana. Yang perlu dilakukan hanyalah membuat instance class pengautentikasi Anda di onCreate() dan memanggil getIBinder() di onBind().

Jangan lupa untuk menambahkan tag <service> ke file manifes Anda, menambahkan filter intent untuk intent AccountAuthenticator, dan mendeklarasikan pengautentikasi akun:

<service ...>
   <intent-filter>
      <action android:name="android.accounts.AccountAuthenticator" />
   </intent-filter>
   <meta-data android:name="android.accounts.AccountAuthenticator"
             android:resource="@xml/authenticator" />
</service>

Mendistribusikan layanan Anda

Selesai! Sistem sekarang mengenali jenis akun Anda, tepat di samping semua jenis akun nama besar seperti "Google" dan "Perusahaan". Anda dapat menggunakan halaman Setelan Akun & Sinkronisasi untuk menambahkan akun, dan aplikasi yang meminta akun jenis kustom Anda dapat melakukan enumerasi dan autentikasi, seperti yang dilakukannya dengan jenis akun lainnya.

Tentu saja, semua ini mengasumsikan bahwa layanan akun Anda benar-benar diinstal di perangkat. Jika hanya satu aplikasi yang dapat mengakses layanan, bukan masalah besar; cukup paketkan layanan di aplikasi. Namun, jika Anda ingin layanan akun digunakan oleh lebih dari satu aplikasi, prosesnya akan semakin rumit. Sebaiknya Anda tidak memaketkan layanan dengan semua aplikasi karena beberapa salinannya akan menghabiskan ruang penyimpanan di perangkat pengguna.

Salah satu solusinya adalah menempatkan layanan tersebut dalam satu APK kecil untuk tujuan khusus. Jika aplikasi ingin menggunakan jenis akun kustom Anda, aplikasi dapat memeriksa perangkat untuk melihat apakah layanan akun kustom Anda tersedia. Jika belum, pengguna dapat diarahkan ke Google Play untuk mendownload layanan. Pada awalnya, hal ini mungkin tampak seperti banyak masalah, tetapi dibandingkan dengan alternatif memasukkan kembali kredensial untuk setiap aplikasi yang menggunakan akun kustom Anda, langkah ini sangat mudah.