Minta 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 mengirim nomor telepon ke server verifikasi dan memanggil API SMS Retriever untuk mulai mendengarkan pesan SMS yang berisi kode satu kali untuk aplikasi Anda. Setelah Anda menerima pesan, Anda mengirim kode satu kali kembali ke server Anda untuk menyelesaikan proses verifikasi.

Sebelum kamu memulai

Untuk menyiapkan aplikasi Anda, selesaikan langkah-langkah di bagian berikut.

Prasyarat aplikasi

Pastikan file build aplikasi Anda menggunakan nilai berikut:

  • Versi minSdk 19 atau lebih tinggi
  • KompilasiSdkVersion 28 atau lebih tinggi

Konfigurasikan aplikasi Anda

Dalam file build.gradle tingkat proyek Anda, termasuk repositori Maven Google dan Maven repositori pusat di kedua Anda buildscript dan allprojects bagian:

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

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

Tambahkan layanan Google Play ketergantungan untuk API SMS Retriever untuk Anda modul Gradle membangun file , yang umumnya app/build.gradle :

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

1. Dapatkan nomor telepon pengguna

Anda dapat memperoleh nomor telepon pengguna dengan cara apa pun yang sesuai untuk aplikasi Anda. Seringkali, ini adalah pengalaman pengguna terbaik untuk menggunakan pemilih petunjuk untuk meminta pengguna memilih dari nomor telepon yang tersimpan di perangkat dan dengan demikian menghindari keharusan mengetikkan 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. Mulai pemanggil SMS

Ketika Anda siap untuk memverifikasi nomor telepon pengguna, mendapatkan contoh dari SmsRetrieverClient objek, panggilan startSmsRetriever , dan melampirkan keberhasilan dan kegagalan pendengar untuk 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 mendengarkan hingga lima menit untuk pesan SMS yang berisi string unik yang mengidentifikasi aplikasi Anda.

3. Kirim nomor telepon ke server Anda

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

Server Anda membuat pesan verifikasi dan mengirimkannya melalui SMS ke nomor telepon yang Anda tentukan. Lihat Lakukan Verifikasi SMS pada Server .

4. Terima pesan verifikasi

Ketika pesan verifikasi diterima pada perangkat pengguna, layanan Play eksplisit siaran untuk aplikasi Anda seorang SmsRetriever.SMS_RETRIEVED_ACTION Intent, yang berisi teks pesan. Gunakan BroadcastReceiver untuk menerima pesan verifikasi ini.

Dalam BroadcastReceiver 's onReceive handler, dapatkan teks pesan verifikasi dari maksud ini ekstra:

/**
 * 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:
          // Get SMS message contents
          String message = (String) extras.get(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;
      }
    }
  }
}

Daftar ini BroadcastReceiver dengan maksud saringan com.google.android.gms.auth.api.phone.SMS_RETRIEVED (nilai SmsRetriever.SMS_RETRIEVED_ACTION konstan) dan izin com.google.android.gms.auth.api.phone.permission.SEND (nilai SmsRetriever.SEND_PERMISSION konstan) di aplikasi Anda AndroidManifest.xml berkas, seperti dalam contoh berikut, atau 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. Kirim kode satu kali dari pesan verifikasi ke server Anda

Sekarang setelah Anda memiliki teks pesan verifikasi, gunakan ekspresi reguler atau logika lain untuk mendapatkan kode satu kali dari pesan tersebut. Format kode satu kali tergantung pada bagaimana Anda menerapkannya di server Anda.

Terakhir, kirim kode satu kali ke server Anda melalui koneksi yang aman. Ketika server Anda menerima kode satu kali, itu mencatat bahwa nomor telepon telah diverifikasi.

Opsional: Simpan nomor telepon dengan Smart Lock untuk Kata Sandi

Opsional, setelah pengguna memverifikasi nomor telepon mereka, Anda dapat meminta pengguna untuk menyimpan akun nomor telepon ini dengan Smart Lock untuk Kata Sandi sehingga akan tersedia secara otomatis di aplikasi lain dan di perangkat lain tanpa harus mengetik atau memilih nomor telepon lagi :

Credential credential = new Credential.Builder(phoneNumberString)
        .setAccountType("https://signin.example.com")  // a URL specific to the app
        .setName(displayName)  // optional: a display name if available
        .build();
Auth.CredentialsApi.save(apiClient, credential).setResultCallback(
            new ResultCallback() {
                public void onResult(Result result) {
                    Status status = result.getStatus();
                    if (status.isSuccess()) {
                        Log.d(TAG, "SAVE: OK");  // already saved
                    } else if (status.hasResolution()) {
                        // Prompt the user to save
                        status.startResolutionForResult(this, RC_SAVE);
                    }
                }
            });

Kemudian, setelah pengguna menginstal ulang aplikasi atau menginstal aplikasi di perangkat baru, Anda dapat mengambil nomor telepon yang disimpan tanpa harus meminta nomor telepon pengguna lagi:

// On the next install, retrieve the phone number
mCredentialRequest = new CredentialRequest.Builder()
    .setAccountTypes("https://signin.example.com")  // the URL specific to the developer
    .build();
Auth.CredentialsApi.request(apiClient, mCredentialRequest).setResultCallback(
    new ResultCallback<CredentialRequestResult>() {
        public void onResult(CredentialRequestResult credentialRequestResult) {
            if (credentialRequestResult.getStatus().isSuccess()) {
                credentialRequestResult.getCredential().getId();  // this is the phone number
            }
        }
    });

// Then, initiate verification and sign the user in (same as original verification logic)