Aby automatycznie weryfikować numery telefonów, musisz wdrożyć zarówno część klienta, jak i serwera procesu weryfikacji. W tym dokumencie opisujemy, jak zaimplementować część klienta w aplikacji na Androida.
Aby rozpocząć proces weryfikacji numeru telefonu w aplikacji na Androida, wyślij numer telefonu na serwer weryfikacyjny i wywołaj interfejs SMS Retriever API, aby rozpocząć nasłuchiwanie wiadomości SMS zawierającej jednorazowy kod dla Twojej aplikacji. Po otrzymaniu wiadomości wyślij jednorazowy kod z powrotem na serwer, aby dokończyć proces weryfikacji.
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:
- wartość minSdkVersion wynosząca co najmniej 19.
- compileSdkVersion w wersji 28 lub nowszej.
Konfigurowanie aplikacji
W sekcjach buildscript
i allprojects
pliku build.gradle na poziomie projektu dodaj repozytorium Maven firmy Google 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.4.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:18.2.0'
}
1. Uzyskiwanie numeru telefonu użytkownika
Numer telefonu użytkownika możesz uzyskać w dowolny sposób odpowiedni dla Twojej aplikacji. Najlepszym rozwiązaniem jest często użycie selektora podpowiedzi, aby poprosić użytkownika o wybranie numeru telefonu zapisanego na urządzeniu. Dzięki temu nie będzie musiał ręcznie wpisywać 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. Uruchomienie narzędzia do pobierania SMS-ów
Gdy zechcesz zweryfikować numer telefonu użytkownika, uzyskaj instancję obiektu SmsRetrieverClient
, wywołaj startSmsRetriever
i dołącz do zadania pobierania SMS-a odbiorniki 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ć wiadomości SMS przez maksymalnie 5 minut. Wiadomość musi zawierać unikalny ciąg znaków, który identyfikuje Twoją aplikację.
3. Prześlij numer telefonu na swój serwer
Po uzyskaniu numeru telefonu użytkownika i rozpoczęciu nasłuchiwania SMS-ów wyślij numer telefonu użytkownika na serwer weryfikacyjny dowolną metodą (zwykle za pomocą żądania POST w protokole HTTPS).
Serwer generuje wiadomość weryfikacyjną i wysyła ją SMS-em na podany numer telefonu. Zobacz Przeprowadzanie weryfikacji SMS-em na serwerze.
4. Otrzymywanie wiadomości weryfikacyjnych
Gdy na urządzeniu użytkownika zostanie odebrana wiadomość weryfikacyjna, usługi Play jawnie wyślą do Twojej aplikacji SmsRetriever.SMS_RETRIEVED_ACTION
IntentSmsRetriever.SMS_RETRIEVED_ACTION
zawierający tekst wiadomości. Użyj BroadcastReceiver
, aby otrzymać
tę wiadomość weryfikacyjną.
W procedurze obsługi BroadcastReceiver
onReceive
pobierz tekst wiadomości weryfikacyjnej (i opcjonalnie adres nadawcy) z dodatków 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 intencjicom.google.android.gms.auth.api.phone.SMS_RETRIEVED
(wartość stałej SmsRetriever.SMS_RETRIEVED_ACTION
) i uprawnień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ą 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 kod jednorazowy z wiadomości weryfikacyjnej na swój serwer.
Teraz, gdy masz już tekst wiadomości weryfikacyjnej, użyj wyrażenia regularnego lub innej logiki, aby uzyskać z niej jednorazowy kod. Format kodu jednorazowego zależy od sposobu jego wdrożenia na serwerze.
Na koniec wyślij jednorazowy kod na serwer przez bezpieczne połączenie. Gdy serwer otrzyma jednorazowy kod, zapisze informację, że numer telefonu został zweryfikowany.