Demander la validation par SMS dans une application Android

Pour valider automatiquement les numéros de téléphone, vous devez implémenter à la fois les les parties serveur du flux de validation. Ce document explique comment implémenter la partie client dans une application Android.

Pour lancer le processus de validation du numéro de téléphone dans une application Android, vous devez envoyer le à votre serveur de validation et appelez l'API SMS Retriever pour d'écouter un SMS contenant un code à usage unique pour votre application. Après avoir vous recevez le message, 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 version minSdkVersion 19 ou ultérieure
  • Une version de compileSdkVersion 28 ou ultérieure

Configurer votre application

Dans le 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 vers le 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.2.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 l'application. Il est souvent préférable d'utiliser l'outil de sélection d'indices pour demander au de choisir parmi les numéros de téléphone stockés sur l'appareil et ainsi éviter sans devoir saisir manuellement un numéro de téléphone. Pour utiliser l'outil de sélection 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, récupérez une instance de la méthode l'objet SmsRetrieverClient, appelez startSmsRetriever, puis associez la commande "réussite" et à 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 les SMS pendant cinq minutes au maximum contenant une chaîne unique identifiant votre application.

3. Envoyer le numéro de téléphone à votre serveur

Après avoir obtenu le numéro de téléphone de l'utilisateur et commencé à écouter les SMS envoyez le numéro de téléphone de l'utilisateur à votre serveur de validation via (généralement avec une requête HTTPS POST).

Votre serveur génère un message de validation et l'envoie par SMS au téléphone. que vous avez spécifié. Consultez la page 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 diffuse explicitement un intent SmsRetriever.SMS_RETRIEVED_ACTION à votre application, qui contient le texte du message. Utilisez un BroadcastReceiver pour recevoir ce message de vérification.

Dans le gestionnaire onReceive de BroadcastReceiver, récupérez le texte de la message de vérification (et éventuellement l'adresse de l'expéditeur) à partir de la couche d'intent extras:

/**
 * 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 (la valeur du paramètre SmsRetriever.SMS_RETRIEVED_ACTION) et l'autorisation com.google.android.gms.auth.api.phone.permission.SEND (la valeur du paramètre constante SmsRetriever.SEND_PERMISSION) dans les 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. Envoyez le code à usage unique du message de validation à votre serveur

Maintenant que vous disposez du texte du message de vérification, utilisez une expression régulière ou une autre logique pour obtenir le code unique à partir du message. Le format du le code à usage unique dépend de la façon dont vous les avez implémentés sur votre serveur.

Enfin, envoyez le code à usage unique à votre serveur via une connexion sécurisée. Quand ? votre serveur reçoit le code à usage unique, il enregistre que le numéro de téléphone a ont été validées.