Diposting oleh Steven Soneff, Identity Product Manager

Untuk membangun aplikasi yang menggunakan nomor telepon, penting sekali untuk memverifikasi bahwa pengguna memiliki nomor telepon. Melakukan ini bisa saja rumit dari perspektif UX, bukan saja dalam memahami format nomor telepon di berbagai wilayah lokal yang berbeda, tetapi juga dalam memberikan mekanisme verifikasi yang tidak rumit atau menggunakan izin perangkat yang mengganggu, seperti kemampuan untuk membaca semua SMS pengguna.

Ada banyak library untuk autentikasi telepon siap pakai yang efisien, seperti Firebase Phone Auth, tetapi jika Anda adalah developer lanjutan dan perlu membangun fungsionalitas ini sendiri, Google Play Services memiliki dua API baru yang membantu Anda memperoleh nomor telepon pengguna dan memverifikasinya melalui SMS tanpa izin perangkat: Phone Selector dan SMS Retriever. Aplikasi seperti Flipkart merasakan peningkatan tingkat keberhasilan sebesar 12% dalam alur sign-up nomor telepon menggunakan metode ini.

Langkah-langkah menggunakannya dengan server Anda bisa dilihat di sini:

Di postingan ini, kami akan menunjukkan kode yang Anda butuhkan untuk menyediakan pemilih nomor telepon kepada pengguna, kemudian menggunakannya dengan SMS retriever API untuk meminta kode verifikasi dari server bahwa perangkat Android akan secara otomatis menerima dan mengurai tanpa masukan dari pengguna

Catatan: Sebelum memulai, Anda perlu membangun dan menguji bahwa ini adalah perangkat dengan nomor telepon yang bisa menerima SMS dan menjalankan Google Play services 10.2.x dan yang lebih tinggi.

Menggunakan Phone Selector untuk mendapatkan nomor


Langkah pertama adalah meminta pengguna melakukan verifikasi SMS dari dalam aplikasi Anda. Aplikasi Anda mungkin meminta pengguna untuk memasukkan nomor telepon, dan Anda bisa menggunakan Phone Selector untuk memudahkannya, dengan menggunakan kode seperti berikut:
// Construct a request for phone numbers and show the picker
private void requestHint() {
    HintRequest hintRequest = new HintRequest.Builder()
           .setPhoneNumberIdentifierSupported(true)
           .build();

    PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(
            apiClient, hintRequest);
    startIntentSenderForResult(intent.getIntentSender(),
            RESOLVE_HINT, null, 0, 0, 0);
}

Builder HintRequest memberi tahu Play Services bahwa dibutuhkan identifier nomor telepon. Ini kemudian digunakan untuk membuat dan memulai sebuah intent, yang akan menampilkan kotak dialog Play Service kepada pengguna yang memungkinkan mereka untuk memilih nomor telepon yang akan dibagikan dengan aplikasi. API ini tidak memerlukan izin, dan menampilkan nomor yang ada di telepon atau Akun Google untuk dipilih pengguna.

Saat pengguna memilih nomor telepon, ia akan ditampilkan ke aplikasi pada onActivityResult dalam format E164 pada perangkat yang menjalankan Play Services versi terbaru. Perhatikan bahwa dalam beberapa kasus, tergantung pada jenis telepon Anda, Anda mungkin tidak mendapatkan nomor telepon, jadi pastikan untuk memeriksa apakah kredensialnya masih berlaku. Jika Anda tidak memiliki nomor, Anda harus memberikan sebuah cara agar pengguna bisa mengetiknya secara manual.
// Obtain the phone number from the result
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == RESOLVE_HINT) {
      if (resultCode == RESULT_OK) {
          Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
          // credential.getId(); <-- E.164 format phone number on 10.2.+ devices
      }
  }
}

Pada titik ini Anda akan memiliki string nomor telepon untuk pengguna. Meskipun ini berguna, Anda mungkin perlu memverifikasi bahwa pengguna memiliki nomor khusus ini, misalnya untuk mengizinkan mereka mengirim atau mengambil pesan dengan pengguna lain atau mengidentifikasi diri mereka dengan nomor ini.

Menggunakan SMS Verification API untuk memverifikasi nomor


Cara termudah untuk memverifikasi kepemilikan nomor telepon adalah dengan mengirim SMS ke nomor tersebut, yang berisi kode verifikasi satu kali, dan meminta pengguna memasukkannya ke dalam aplikasi Anda. SMS Verification API memberikan kemampuan pada aplikasi untuk mendengarkan SMS masuk, kemudian mengurai kode secara otomatis.

Untuk memulai, aplikasi Anda akan SmsRetrieverClient dengan kode seperti berikut:
SmsRetrieverClient client = SmsRetriever.getClient(this /* context */);

Task<Void> task = client.startSmsRetriever();

task.addOnSuccessListener(new OnSuccessListener<Void>() {
  @Override
  public void onSuccess(Void aVoid) {
    // successfully started an SMS Retriever for one SMS message
  }
});

task.addOnFailureListener(new OnFailureListener() {
  @Override
  public void onFailure(@NonNull Exception e) {
  });
);

Ini sangat mudah -- Anda mendapatkan klien SMS Retriever kemudian menjalankan tugas untuk hal tersebut. Tugas tersebut memiliki listener Success serta Failure yang harus diganti. Setelah memulai SMS Retriever, Anda mengirimkan nomor telepon pengguna ke server dan memulai alur kerja untuk menghasilkan pesan dan mengirimkannya ke nomor tersebut.

Pesan harus dibangun dengan cara yang sudah ditetapkan. Pesan harus sesuai dengan format pesan SMS, jadi tidak boleh berukuran lebih dari 140 byte. Pesan harus dimulai dengan awalan tertentu: '<#>' atau dua karakter spasi berlebar-kosong berturut-turut (U+200B). Lihat dokumentasi untuk informasi selengkapnya. Pesan harus diakhiri dengan hash 11 karakter yang mengidentifikasi aplikasi Anda, seperti yang dijelaskan di bawah ini.

Contoh:

<#> Use 123456 as your verification code in Example App!
FA+9qCX9VSu

Kode verifikasi satu kali bisa berupa string: Anda bisa membuat nomor acak. Pesan harus diakhiri dengan hash yang ditentukan sesuai prosedur di sini. Google Play services akan menggunakan hash ini untuk menentukan aplikasi yang menjadi target pesan verifikasi. Anda hanya perlu membuat hash ini satu kali untuk paket aplikasi dan sertifikat penandatanganan: ia tidak akan berubah dan tidak boleh dipasok oleh aplikasi klien.

Server Anda kemudian mengirim pesan ke telepon menggunakan infrastruktur atau layanan SMS yang ada. Saat pesan ini diterima, Google Play services menyiarkan intent yang berisi teks pesan. Inilah kodenya:
public class MySMSBroadcastReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
      Bundle extras = intent.getExtras();
      Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);

      switch(status.getStatusCode()) {
        case CommonStatusCodes.SUCCESS:
          String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
          break;
        case CommonStatusCodes.TIMEOUT:
          break;
      }
    }
  }
}

Pada bagian onReceive dari broadcast receiver Anda mendapatkan extras, dan menarik status dari sana. Jika status menunjukkan bahwa pesan telah berhasil diterima, Anda bisa menarik pesan dari extras. Dari sini, Anda bisa mengurai kode verifikasi dan mengirimkannya kembali ke server untuk mengonfirmasikan kepemilikan nomor telepon.

Untuk informasi selengkapnya, lihat dokumentasi lengkap dan pembicaraan Google I/O tahun ini.

Testimoni dari Pengguna Awal


Mitra awal kami yang menggunakan API ini sangat menyukainya. Berikut adalah beberapa testimoni dari mereka:

Twilio mengamati dan membuat blog bahwa Verifikasi SMS Android tidak pernah semudah ini.

"Jika Anda adalah developer yang membangun aplikasi seluler di Android serta menggunakan nomor telepon untuk mendaftar dan mengidentifikasi akun pengguna, Anda harus menggunakan Twilio Verification SDK for Android untuk cara tercepat menyelesaikan masalah dalam menyediakan alur sign-up yang mulus, aman, dan mudah." - Simon Thorpe, Product Owner di Twilio

Authy menyukai fakta bahwa API ini bisa digunakan dengan infrastruktur SMS mereka tanpa memerlukan banyak perubahan.

"Menambahkan Phone Selector + SMS Retriever ke dalam aplikasi Authy 2FA memberikan UX menakjubkan bagi pengguna selagi tetap mempertahankan keamanan tinggi yang dibutuhkan aplikasi kami." -- Serge Kruppa, Head of Authy Engineering

Telesign mengamati UX yang lebih baik, peningkatan keamanan dan rasio konversi yang lebih tinggi dengan backend framework yang sama.

"Salah satu keuntungan signifikan dari mode verifikasi dengan friksi yang lebih rendah ini adalah bahwa pengguna mungkin melihat peningkatan rasio konversi untuk skenario registrasi dan sign-up pengguna.

Peningkatan keamanan ini juga memberikan keuntungan karena Google Play Services hanya menyediakan akses ke pesan SMS untuk aplikasi yang ditargetkan berdasarkan hash aplikasi di dalam pesan." -- Priyesh Jain (Post author)