Aby automatycznie weryfikować numery telefonów, musisz wdrożyć proces weryfikacji obejmujący zarówno klienta, jak i serwera. W tym dokumencie opisujemy, jak wdrożyć w aplikacji na Androida część kliencką.
Aby rozpocząć procedurę weryfikacji numeru telefonu w aplikacji na Androida, należy wysłać numer telefonu na serwer weryfikacyjny i wywołać interfejs SMS Retriever API w celu rozpoczęcia nasłuchiwania SMS-a z jednorazowym kodem do aplikacji. Po otrzymaniu wiadomości wyślij ten kod z powrotem na serwer, aby ukoń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:
- a minSdkVersion w wersji 19 lub nowszej.
- Kompilacja wersjiSdkVersion 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. Uzyskaj numer telefonu użytkownika
Numer telefonu użytkownika możesz uzyskać w dowolny sposób, który jest odpowiedni dla Twojej aplikacji. Często najlepszym rozwiązaniem jest użycie selektora podpowiedzi, aby poprosić użytkownika o wybranie numeru telefonu zapisanego na urządzeniu i uniknąć konieczności ręcznego wpisywania numeru. Aby użyć selektora wskazówek:
// 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
Gdy zechcesz zweryfikować numer telefonu użytkownika, pobierz wystąpienie obiektu SmsRetrieverClient
, wywołaj startSmsRetriever
i dołącz detektory sukcesów i błędów do zadania pobierania SMS-ów:
// 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 z unikalnym ciągiem znaków identyfikującym aplikację.
3. Wyślij numer telefonu na swój serwer
Gdy uzyskasz numer telefonu użytkownika i zaczniesz nasłuchiwać SMS-ów, wyślij numer telefonu użytkownika na swój serwer weryfikacyjny za pomocą dowolnej metody (zwykle z użyciem żądania HTTPS POST).
Serwer generuje wiadomość weryfikacyjną i wysyła ją SMS-em na podany numer telefonu. Zobacz Weryfikowanie SMS-em na serwerze.
4. Otrzymuj wiadomości weryfikacyjne
Gdy na urządzeniu użytkownika pojawia się wiadomość weryfikacyjna, Usługi Google Play wyraźnie przesyłają do aplikacji intencję SmsRetriever.SMS_RETRIEVED_ACTION
, która zawiera treść wiadomości. Aby odebrać tę wiadomość weryfikacyjną, użyj numeru BroadcastReceiver
.
W module obsługi onReceive
obiektu BroadcastReceiver
pobierz tekst wiadomości weryfikacyjnej (i opcjonalnie adres nadawcy) z rozszerzeń 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:
// (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 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 poniższym przykładzie, lub dynamicznie za pomocą 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 jednorazowy kod z wiadomości weryfikacyjnej na swój serwer
Skoro masz już treść wiadomości weryfikacyjnej, użyj wyrażenia regularnego lub innej metody logicznej, aby pobrać jednorazowy kod z wiadomości. Format jednorazowego kodu zależy od sposobu, w jaki został zaimplementowany na serwerze.
Na koniec wyślij jednorazowy kod na swój serwer przez bezpieczne połączenie. Gdy serwer otrzyma jednorazowy kod, rejestruje, że numer telefonu został zweryfikowany.