Per verificare automaticamente i numeri di telefono, devi implementare sia il client che parti del server durante il flusso di verifica. Questo documento descrive come implementare la parte del client in un'app per Android.
Per avviare il flusso di verifica del numero di telefono in un'app per Android, invia numero di telefono al tuo server di verifica e chiama l'API SMS Retriever per iniziare per ascoltare un messaggio SMS contenente un codice monouso per la tua app. Dopo ricevi il messaggio, invii il codice monouso al server affinché la procedura di verifica.
Prima di iniziare
Per preparare l'app, completa i passaggi nelle sezioni seguenti.
Prerequisiti dell'app
Assicurati che il file di build dell'app utilizzi i seguenti valori:
- Una versione minSdkVersion 19 o successiva
- Una versione compileSdkVersion 28 o successiva
Configura la tua app
Nel file build.gradle a livello di progetto, includi il Repository Maven di Google
e il repository centrale Maven
in entrambe le sezioni buildscript
e allprojects
:
buildscript {
repositories {
google()
mavenCentral()
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
Aggiungi la dipendenza di Google Play Services
per l'API SMS Retriever al file di build Gradle del modulo,
che in genere è 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. Procurati il numero di telefono dell'utente
Puoi ottenere il numero di telefono dell'utente nel modo più appropriato per il tuo dell'app. Spesso, l'utilizzo del selettore di suggerimenti per richiedere il comando l'utente può scegliere tra i numeri di telefono memorizzati sul dispositivo ed evitare così dover digitare manualmente un numero di telefono. Per utilizzare il selettore di suggerimenti:
// 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. Avvia il recupero SMS
Quando è tutto pronto per verificare il numero di telefono dell'utente, ottieni un'istanza del
SmsRetrieverClient
oggetto, chiamata startSmsRetriever
e collegamento riuscito e
listener di errori per l'attività di recupero 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
// ...
}
});
L'attività di recupero SMS rimane in ascolto per un massimo di cinque minuti per i messaggi SMS contenente una stringa univoca che identifica la tua app.
3. Invia il numero di telefono al server
Dopo aver ottenuto il numero di telefono dell'utente e aver iniziato ad ascoltare gli SMS messaggi, invia il numero di telefono dell'utente al tuo server di verifica tramite (di solito con una richiesta POST HTTPS).
Il server genera un messaggio di verifica e lo invia tramite SMS al telefono al numero specificato. Consulta l'articolo Eseguire la verifica tramite SMS sul server.
4. Ricevi messaggi di verifica
Quando viene ricevuto un messaggio di verifica sul dispositivo dell'utente, Play Services
trasmette esplicitamente alla tua app un intent SmsRetriever.SMS_RETRIEVED_ACTION
,
che contiene il testo del messaggio. Usa BroadcastReceiver
per ricevere
questo messaggio di verifica.
Nel gestore onReceive
di BroadcastReceiver
, ottieni il testo dell'elemento
messaggio di verifica (e facoltativamente l'indirizzo del mittente) dall'account
extra:
/**
* 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;
}
}
}
}
Registra questo BroadcastReceiver
con il filtro per intent
com.google.android.gms.auth.api.phone.SMS_RETRIEVED
(il valore del tag
costante SmsRetriever.SMS_RETRIEVED_ACTION
) e l'autorizzazione
com.google.android.gms.auth.api.phone.permission.SEND
(il valore del parametro
costante SmsRetriever.SEND_PERMISSION
) nella metrica AndroidManifest.xml
dell'app
come nell'esempio seguente, o in modo dinamico utilizzando 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. Invia il codice monouso dal messaggio di verifica al tuo server
Ora che hai il testo del messaggio di verifica, utilizza un'espressione regolare o qualche altra logica per ottenere il codice monouso dal messaggio. Il formato del il codice monouso dipende da come è stato implementato nel server.
Infine, invia il codice monouso al tuo server tramite una connessione sicura. Quando il server riceve il codice monouso, registra che il numero di telefono che è stato verificato.