Membuat jenis akun kustom

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

Menerapkan kode akun kustom

Hal pertama yang Anda perlukan adalah cara mendapatkan kredensial dari pengguna. Caranya mungkin sesederhana kotak dialog yang menanyakan nama dan sandi, atau prosedur yang lebih rumit seperti sandi sekali pakai atau pemindaian biometrik. Apa pun itu, Anda harus 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 dengan aktivitas pengautentikasi.

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

Cara Anda menangani dua persyaratan pertama aktivitas pengautentikasi, yaitu pengumpulan kredensial dan autentikasi, sepenuhnya terserah Anda. (Seandainya hanya ada satu cara untuk melakukannya, tentu tidak perlu ada jenis akun "kustom".) Persyaratan ketiga memiliki penerapan 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 dipahami bahwa AccountManager bukanlah layanan enkripsi atau keychain. Fitur ini menyimpan kredensial akun persis seperti yang Anda masukkan, dalam teks biasa. Di sebagian besar perangkat, Ini bukan masalah, karena kredensial 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 tersebut, sebaiknya Anda tidak memasukkan sandi pengguna sebenarnya ke AccountManager.addAccountExplicitly(). Sebagai gantinya, simpanlah token yang aman secara kriptografis, yang tidak banyak berguna bagi penyerang. Jika kredensial pengguna Anda melindungi informasi berharga, pertimbangkan untuk melakukan hal serupa dengan cermat.

Ingat: Dalam kaitannya dengan kode keamanan, ikuti aturan "Mythbuster": jangan coba sendiri di rumah! Hubungi pakar keamanan sebelum menerapkan kode akun kustom apa pun.

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

Memperluas AbstractAccountAuthenticator

Agar AccountManager dapat digunakan 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 tentu tidak akan terasa asing: keduanya adalah sisi kebalikan dari metode yang Anda panggil dalam tutorial sebelumnya untuk memperoleh informasi akun dan token otorisasi.

Untuk mengimplementasikan class pengautentikasi dengan benar diperlukan sejumlah penggalan 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 sistem di samping akun jenis ini.

Anda dapat menemukan panduan langkah demi langkah agar berhasil menerapkan class pengautentikasi dan file XML dalam dokumentasi AbstractAccountAuthenticator. Contoh implementasi juga tersedia di contoh aplikasi SampleSyncAdapter.

Selagi mempelajari seluruh kode SampleSyncAdapter, Anda akan melihat bahwa beberapa metode mengembalikan intent dalam suatu paket. Ini adalah intent sama dengan yang akan digunakan untuk meluncurkan aktivitas pengautentikasi kustom Anda. 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 bagi beberapa aplikasi dan berjalan di latar belakang; karena itu, pengautentikasi akun harus berjalan di dalam Service. Kita menyebutnya dengan layanan pengautentikasi.

Layanan pengautentikasi Anda bisa sangat sederhana. Yang perlu dilakukan hanyalah membuat instance class pengautentikasi Anda di onCreate() dan memanggil getIBinder() di onBind(). Contoh yang baik dari layanan pengautentikasi dapat dilihat di SampleSyncAdapter.

Jangan lupa untuk menambahkan tag <service> ke file manifes Anda dan 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 dengan nama besar seperti "Google" dan "Corporate". Anda dapat menggunakan halaman Setelan Akun & Sinkronisasi untuk menambahkan akun, dan aplikasi yang meminta akun jenis kustom Anda dapat melakukan enumerasi dan autentikasi, sama seperti yang dilakukannya dengan jenis akun lainnya.

Tentu saja, semua ini mengasumsikan bahwa layanan akun Anda benar-benar terinstal di perangkat. Jika hanya satu aplikasi yang akan mengakses layanan, maka ini bukan masalah besar—cukup paketkan layanan ke dalam aplikasi. Namun, jika Anda ingin layanan akun digunakan oleh lebih dari satu aplikasi, semuanya akan semakin rumit. Sebaiknya Anda tidak memaketkan layanan itu dengan semua aplikasi Anda, karena salinannya yang banyak akan menghabiskan ruang penyimpanan di perangkat pengguna Anda.

Salah satu solusinya adalah menempatkan layanan tersebut dalam satu APK kecil untuk tujuan khusus. Saat aplikasi ingin menggunakan jenis akun kustom Anda, aplikasi tersebut dapat memeriksa perangkat untuk melihat apakah layanan akun kustom Anda sudah tersedia Jika belum, aplikasi dapat mengarahkan pengguna ke Google Play untuk mendownloadnya. Masalah ini mungkin tampak sangat berat pada awalnya, tetapi dibandingkan dengan cara alternatif, yaitu memasukkan ulang kredensial untuk setiap aplikasi yang menggunakan akun kustom Anda, cara ini jauh lebih mudah.