Wysyłanie prośby o weryfikację przez SMS-a w aplikacji na Androida

Aby automatycznie weryfikować numery telefonów, musisz wdrożyć w procesie weryfikacji zarówno klienta, jak i serwer. W tym dokumencie opisujemy, jak wdrożyć w aplikacji na Androida część kliencką.

Aby rozpocząć proces weryfikacji numeru telefonu w aplikacji na Androida, musisz wysłać numer telefonu do serwera weryfikacji i wywołać interfejs SMS retriever API w celu rozpoczęcia nasłuchiwania SMS-a zawierającego jednorazowy kod do Twojej aplikacji. Po otrzymaniu tej wiadomości wysyłasz jednorazowy kod z powrotem na serwer, aby dokończyć proces weryfikacji.

Zanim zaczniesz

Aby przygotować aplikację, wykonaj czynności opisane w poniższych sekcjach.

Wymagania wstępne aplikacji

Upewnij się, że plik kompilacji aplikacji zawiera te wartości:

  • Wersja minSdkVersion w wersji 19 lub nowszej
  • A CompactVersion w wersji 28 lub nowszej

Konfiguracja aplikacji

W sekcjach buildscript i allprojects pliku build.gradle na poziomie projektu dodaj repozytorium Google Maven i centralne repozytorium Maven:

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

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

Dodaj zależność Usług Google Play do interfejsu SMS retriever API do pliku build.gradle modułu. Jest to zwykle app/build.gradle:

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

1. Uzyskiwanie numeru telefonu użytkownika

Możesz uzyskać numer telefonu użytkownika w sposób odpowiedni dla Twojej aplikacji. Często najlepszym rozwiązaniem jest korzystanie z selektora podpowiedzi, aby prosić użytkownika o wybór numeru telefonu z urządzenia i unikać ręcznego wpisywania numeru. Aby użyć selektora podpowiedzi:

// 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. Uruchamianie modułu pobierania SMS-ów

Jeśli chcesz zweryfikować numer telefonu użytkownika, pobierz instancję obiektu SmsRetrieverClient, wywołaj startSmsRetriever i dołącz detektory powodzenia oraz niepowodzenia do zadania pobierania SMS-a:

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

Zadanie pobierania SMS-ów czeka na SMS-a z unikalnym ciągiem znaków identyfikującym aplikację przez maksymalnie 5 minut.

3. Wyślij numer telefonu na swój serwer

Po uzyskaniu numeru telefonu użytkownika i rozpoczęciu nasłuchiwania SMS-ów wyślij jego numer telefonu na swój serwer weryfikacji, korzystając z dowolnej metody (zwykle z żądaniem HTTPS POST).

Serwer generuje wiadomość weryfikacyjną i wysyła ją SMS-em na podany numer telefonu. Zobacz Przeprowadzanie weryfikacji SMS na serwerze.

4. Otrzymuj wiadomości weryfikacyjne

Gdy na urządzenie użytkownika zostanie odebrana wiadomość weryfikacyjna, Usługi Google Play jednoznacznie przekażą Twojej aplikacji intencję SmsRetriever.SMS_RETRIEVED_ACTION, która zawiera tekst wiadomości. Aby ją otrzymać, użyj adresu BroadcastReceiver.

W module obsługi onReceive usługi BroadcastReceiver pobierz tekst wiadomości weryfikacyjnej z dodatków intencji:

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

Zarejestruj BroadcastReceiver za pomocą filtra intencji com.google.android.gms.auth.api.phone.SMS_RETRIEVED (wartość stałej SmsRetriever.SMS_RETRIEVED_ACTION) i uprawnienia com.google.android.gms.auth.api.phone.permission.SEND (wartości stałej SmsRetriever.SEND_PERMISSION) w pliku AndroidManifest.xml aplikacji, jak w przykładzie poniżej, lub za pomocą dynamicznego ustawienia 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. Wyślij na swój serwer jednorazowy kod z wiadomości weryfikacyjnej

Teraz gdy masz już tekst wiadomości weryfikacyjnej, użyj wyrażenia regularnego lub innej funkcji logicznej, aby pobrać jednorazowy kod z wiadomości. Format kodu jednorazowego zależy od sposobu zaimplementowania go na serwerze.

Na koniec wyślij jednorazowy kod na swój serwer, korzystając z bezpiecznego połączenia. Gdy serwer otrzyma jednorazowy kod, odnotuje, że numer telefonu został zweryfikowany.