Pour valider automatiquement les numéros de téléphone, vous devez implémenter à la fois les parties client et serveur du flux de validation. Ce document explique comment implémenter la partie cliente dans une application Android.
Pour démarrer le flux de validation du numéro de téléphone dans une application Android, vous envoyez le numéro de téléphone à votre serveur de validation et appelez l'API SMS Retriever pour commencer à écouter un message SMS contenant un code à usage unique pour votre application. Une fois que vous avez reçu le message, vous renvoyez le code à usage unique à votre serveur pour terminer la procédure de validation.
Avant de commencer
Pour préparer votre application, procédez comme indiqué dans les sections suivantes.
Conditions requises pour l'application
Assurez-vous que le fichier de compilation de votre application utilise les valeurs suivantes :
- Une valeur minSdkVersion de 19 ou supérieure
- compileSdkVersion 28 ou version ultérieure
Configurer votre application
Dans votre fichier build.gradle au niveau du projet, incluez le dépôt Maven de Google et le dépôt central Maven dans les sections buildscript
et allprojects
:
buildscript {
repositories {
google()
mavenCentral()
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
Ajoutez la dépendance des services Google Play pour l'API SMS Retriever au fichier de compilation Gradle de votre module, qui est généralement 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. Obtenir le numéro de téléphone de l'utilisateur
Vous pouvez obtenir le numéro de téléphone de l'utilisateur de la manière la plus appropriée pour votre application. Souvent, l'expérience utilisateur est optimale si vous utilisez le sélecteur d'indices pour inviter l'utilisateur à choisir parmi les numéros de téléphone stockés sur l'appareil et éviter ainsi de devoir saisir manuellement un numéro de téléphone. Pour utiliser le sélecteur d'indices:
// 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. Démarrer le récupérateur de SMS
Lorsque vous êtes prêt à valider le numéro de téléphone de l'utilisateur, obtenez une instance de l'objet SmsRetrieverClient
, appelez startSmsRetriever
et associez des écouteurs de réussite et d'échec à la tâche de récupération de 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
// ...
}
});
La tâche de récupération de SMS écoutera jusqu'à cinq minutes un message SMS contenant une chaîne unique qui identifie votre application.
3. Envoyer le numéro de téléphone à votre serveur
Une fois que vous avez obtenu le numéro de téléphone de l'utilisateur et commencé à écouter les messages SMS, envoyez-le à votre serveur de validation à l'aide de n'importe quelle méthode (généralement avec une requête POST HTTPS).
Votre serveur génère un message de validation et l'envoie par SMS au numéro de téléphone que vous avez spécifié. Consultez Effectuer la validation par SMS sur le serveur.
4. Recevoir des messages de validation
Lorsqu'un message de validation est reçu sur l'appareil de l'utilisateur, les services Play diffusent explicitement un intent SmsRetriever.SMS_RETRIEVED_ACTION
dans votre application, qui contient le texte du message. Utilisez un BroadcastReceiver
pour recevoir ce message de validation.
Dans le gestionnaire onReceive
de BroadcastReceiver
, obtenez le texte du message de validation (et éventuellement l'adresse de l'expéditeur) à partir des éléments supplémentaires de l'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;
}
}
}
}
Enregistrez ce BroadcastReceiver
avec le filtre d'intent com.google.android.gms.auth.api.phone.SMS_RETRIEVED
(valeur de la constante SmsRetriever.SMS_RETRIEVED_ACTION
) et l'autorisation com.google.android.gms.auth.api.phone.permission.SEND
(valeur de la constante SmsRetriever.SEND_PERMISSION
) dans le fichier AndroidManifest.xml
de votre application, comme dans l'exemple suivant, ou de manière dynamique à l'aide de 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. Envoyer le code à usage unique du message de validation à votre serveur
Maintenant que vous avez le texte du message de validation, utilisez une expression régulière ou une autre logique pour obtenir le code à usage unique du message. Le format du code à usage unique dépend de la manière dont vous l'avez implémenté sur votre serveur.
Enfin, envoyez le code à usage unique à votre serveur via une connexion sécurisée. Lorsque votre serveur reçoit le code à usage unique, il enregistre que le numéro de téléphone a été validé.