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

Aby automatycznie weryfikować numery telefonów, musisz zaimplementować zarówno część klienta, jak i serwera procesu weryfikacji. Z tego dokumentu dowiesz się, jak zaimplementować część klienta w aplikacji na Androida.

Aby rozpocząć proces weryfikacji numeru telefonu w aplikacji na Androida, wyślij numer telefonu na serwer weryfikacji i wywołaj interfejs SMS Retriever API, aby zacząć nasłuchiwać wiadomości SMS zawierającej jednorazowy kod dla Twojej aplikacji. Po otrzymaniu wiadomości wyślij ten 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 dotyczące aplikacji

Sprawdź, czy w pliku kompilacji Twojej aplikacji znajdują się te wartości:

  • parametr minSdkVersion o wartości 19 lub wyższej,
  • compileSdkVersion 28 lub nowsza.

Konfiguracja aplikacji

W pliku build.gradle na poziomie projektu dodaj repozytorium Google Mavencentralne repozytorium Maven w sekcjach buildscriptallprojects:

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.3.0'
  implementation 'com.google.android.gms:play-services-auth-api-phone:18.1.0'
}

1. Pobieranie numeru telefonu użytkownika

Numer telefonu użytkownika możesz pobrać w dowolny sposób odpowiedni dla Twojej aplikacji. Często najlepszym rozwiązaniem jest użycie selektora podpowiedzi, aby zachęcić użytkownika do wybrania numeru telefonu z numerów zapisanych na urządzeniu, dzięki czemu nie będzie musiał wpisywać numeru ręcznie. 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. Uruchom narzędzie do pobierania SMS-ów

Gdy chcesz zweryfikować numer telefonu użytkownika, pobierz wystąpienie obiektu SmsRetrieverClient, wywołaj metodę startSmsRetriever i do zadań pobierania SMS-ów dołącz procedury obsługi sukcesu i błędu:

// 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 będzie nasłuchiwać przez maksymalnie 5 minut wiadomości SMS zawierającej unikalny ciąg znaków identyfikujący Twoją aplikację.

3. Wysyłanie numeru telefonu na serwer

Po uzyskaniu numeru telefonu użytkownika i rozpoczęciu nasłuchiwania wiadomości SMS wyślij numer telefonu użytkownika na serwer weryfikacji za pomocą dowolnej metody (zwykle za pomocą żądania POST w protokole HTTPS).

Twój serwer generuje wiadomość weryfikacyjną i wysyła ją SMS-em na podany numer telefonu. Zobacz Weryfikacja przez SMS-a po stronie serwera.

4. otrzymywać wiadomości weryfikacyjne;

Gdy na urządzeniu użytkownika zostanie odebrana wiadomość weryfikacyjna, usługi Google Play prześlą do aplikacji wyraźną transmisję SmsRetriever.SMS_RETRIEVED_ACTIONIntent, która zawiera tekst wiadomości. Aby otrzymać tę wiadomość z weryfikacją, użyj BroadcastReceiver.

W obiekcie BroadcastReceiver onReceive pobierz tekst wiadomości weryfikacyjnej (i opcjonalnie adres nadawcy) z elementów dodatkowych obiektu 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;
      }
    }
  }
}

Zarejestruj ten element 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ść stałej SmsRetriever.SEND_PERMISSION) w pliku AndroidManifest.xml aplikacji, jak w tym przykładzie, lub dynamicznie za pomocą elementu 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 serwer kod jednorazowy z wiadomości weryfikacyjnej

Teraz, gdy masz już tekst wiadomości weryfikacyjnej, użyj wyrażenia regularnego lub innej logiki, aby uzyskać kod jednorazowy z wiadomości. Format kodu jednorazowego zależy od sposobu jego implementacji na serwerze.

Na koniec wyślij kod jednorazowy na serwer przez bezpieczne połączenie. Gdy Twój serwer otrzyma kod jednorazowy, odnotuje, że numer telefonu został zweryfikowany.