Meminta Verifikasi SMS di Aplikasi Android

Untuk memverifikasi nomor telepon secara otomatis, Anda harus menerapkan bagian klien dan server dari alur verifikasi. Dokumen ini menjelaskan cara mengimplementasikan bagian klien di aplikasi Android.

Untuk memulai alur verifikasi nomor telepon di aplikasi Android, Anda harus mengirim nomor telepon ke server verifikasi dan memanggil SMS Retriever API untuk mulai memproses pesan SMS yang berisi kode sekali pakai untuk aplikasi Anda. Setelah menerima pesan, Anda harus mengirim kode sekali pakai kembali ke server untuk menyelesaikan proses verifikasi.

Sebelum memulai

Untuk mempersiapkan aplikasi Anda, selesaikan langkah-langkah di bagian berikut ini.

Prasyarat aplikasi

Pastikan bahwa file build aplikasi Anda menggunakan nilai berikut:

  • minSdkVersion 19 atau yang lebih tinggi
  • compileSdkVersion 28 atau yang lebih tinggi

Mengonfigurasi aplikasi Anda

Dalam file build.gradle level project, sertakan repositori Maven Google dan repositori pusat Maven di bagian buildscript dan allprojects:

buildscript {
    repositories {
        google()
        mavenCentral()
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

Tambahkan dependensi layanan Google Play untuk SMS Retriever API ke file build Gradle modul Anda, yang biasanya adalah app/build.gradle:

dependencies {
  implementation 'com.google.android.gms:play-services-auth:21.3.0'
  implementation 'com.google.android.gms:play-services-auth-api-phone:18.1.0'
}

1. Mendapatkan nomor telepon pengguna

Anda bisa mendapatkan nomor telepon pengguna dengan cara apa pun yang sesuai untuk aplikasi Anda. Sering kali, pengalaman pengguna terbaik adalah menggunakan pemilih petunjuk untuk meminta pengguna memilih dari nomor telepon yang disimpan di perangkat, sehingga menghindari harus mengetik nomor telepon secara manual. Untuk menggunakan pemilih petunjuk:

// 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);
}

// 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();  <-- will need to process phone number string
      }
  }
}

2. Memulai pengambil SMS

Jika Anda siap memverifikasi nomor telepon pengguna, dapatkan instance objek SmsRetrieverClient, panggil startSmsRetriever, dan lampirkan pemroses keberhasilan dan kegagalan ke tugas pengambilan SMS:

// Get an instance of SmsRetrieverClient, used to start listening for a matching
// SMS message.
SmsRetrieverClient client = SmsRetriever.getClient(this /* context */);

// Starts SmsRetriever, which waits for ONE matching SMS message until timeout
// (5 minutes). The matching SMS message will be sent via a Broadcast Intent with
// action SmsRetriever#SMS_RETRIEVED_ACTION.
Task<Void> task = client.startSmsRetriever();

// Listen for success/failure of the start Task. If in a background thread, this
// can be made blocking using Tasks.await(task, [timeout]);
task.addOnSuccessListener(new OnSuccessListener<Void>() {
  @Override
  public void onSuccess(Void aVoid) {
    // Successfully started retriever, expect broadcast intent
    // ...
  }
});

task.addOnFailureListener(new OnFailureListener() {
  @Override
  public void onFailure(@NonNull Exception e) {
    // Failed to start retriever, inspect Exception for more details
    // ...
  }
});

Tugas pengambilan SMS akan memproses hingga lima menit untuk pesan SMS yang berisi string unik yang mengidentifikasi aplikasi Anda.

3. Mengirim nomor telepon ke server Anda

Setelah Anda mendapatkan nomor telepon pengguna dan mulai memproses pesan SMS, kirim nomor telepon pengguna ke server verifikasi menggunakan metode apa pun (biasanya dengan permintaan POST HTTPS).

Server Anda akan membuat pesan verifikasi dan mengirimkannya melalui SMS ke nomor telepon yang Anda tentukan. Lihat Melakukan Verifikasi SMS di Server.

4. Menerima pesan verifikasi

Saat pesan verifikasi diterima di perangkat pengguna, layanan Play akan menyiarkan Intent SmsRetriever.SMS_RETRIEVED_ACTION secara eksplisit ke aplikasi Anda, yang berisi teks pesan. Gunakan BroadcastReceiver untuk menerima pesan verifikasi ini.

Di pengendali onReceive BroadcastReceiver, dapatkan teks pesan verifikasi (dan secara opsional alamat pengirim) dari tambahan Intent:

/**
 * BroadcastReceiver to wait for SMS messages. This can be registered either
 * in the AndroidManifest or at runtime.  Should filter Intents on
 * SmsRetriever.SMS_RETRIEVED_ACTION.
 */
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:
          // (Optional) Get SMS Sender address - only available in
          // GMS version 24.20 onwards, else it will return null
          String senderAddress = extras.getString(SmsRetriever.EXTRA_SMS_ORIGINATING_ADDRESS);
          // Get SMS message contents
          String message = extras.getString(SmsRetriever.EXTRA_SMS_MESSAGE);
          // Extract one-time code from the message and complete verification
          // by sending the code back to your server.
          break;
        case CommonStatusCodes.TIMEOUT:
          // Waiting for SMS timed out (5 minutes)
          // Handle the error ...
          break;
      }
    }
  }
}

Daftarkan BroadcastReceiver ini dengan filter intent com.google.android.gms.auth.api.phone.SMS_RETRIEVED (nilai konstanta SmsRetriever.SMS_RETRIEVED_ACTION) dan izin com.google.android.gms.auth.api.phone.permission.SEND (nilai konstanta SmsRetriever.SEND_PERMISSION) dalam file AndroidManifest.xml aplikasi Anda, seperti dalam contoh berikut, atau secara dinamis menggunakan Context.registerReceiver.

<receiver android:name=".MySMSBroadcastReceiver" android:exported="true"
          android:permission="com.google.android.gms.auth.api.phone.permission.SEND">
    <intent-filter>
        <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED"/>
    </intent-filter>
</receiver>

5. Mengirimkan kode sekali pakai dari pesan verifikasi ke server Anda

Setelah Anda memiliki teks pesan verifikasi, gunakan ekspresi reguler atau beberapa logika lain untuk mendapatkan kode sekali pakai dari pesan. Format kode satu kali bergantung pada cara Anda menerapkannya di server.

Terakhir, kirim kode sekali pakai ke server Anda melalui koneksi aman. Saat menerima kode sekali pakai, server akan mencatat bahwa nomor telepon telah diverifikasi.