Cette page a été traduite par l'API Cloud Translation.
Switch to English

Demander une vérification par SMS dans une application Android

Pour vérifier automatiquement les numéros de téléphone, vous devez implémenter les parties client et serveur du flux de vérification. Ce document décrit comment implémenter la partie client dans une application Android.

Pour démarrer le flux de vérification du numéro de téléphone dans une application Android, vous envoyez le numéro de téléphone à votre serveur de vérification et appelez l'API SMS Retriever pour commencer à écouter un message SMS contenant un code unique pour votre application. Après avoir reçu le message, vous renvoyez le code à usage unique à votre serveur pour terminer le processus de vérification.

Conditions préalables

L'API SMS Retriever est disponible uniquement sur les appareils Android avec les services Play version 10.2 et plus récents.

Installer les dépendances

Incluez le composant d'authentification des services Play dans le fichier build.gradle votre application:

implementation 'com.google.android.gms:play-services-auth:17.0.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:17.4.0'

1. Obtenez 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 appropriée pour votre application. Souvent, la meilleure expérience utilisateur consiste à utiliser le sélecteur d'indices pour inviter l'utilisateur à choisir parmi les numéros de téléphone stockés sur l'appareil et ainsi éviter d'avoir à 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émarrez le récupérateur de SMS

Lorsque vous êtes prêt à vérifier le numéro de téléphone de l'utilisateur, obtenez une instance de l'objet SmsRetrieverClient , appelez startSmsRetriever et startSmsRetriever les startSmsRetriever 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 pour un message SMS contenant une chaîne unique identifiant votre application.

3. Envoyez 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 messages SMS, envoyez le numéro de téléphone de l'utilisateur à votre serveur de vérification en utilisant n'importe quelle méthode (généralement avec une requête HTTPS POST).

Votre serveur génère un message de vérification et l'envoie par SMS au numéro de téléphone que vous avez spécifié. Voir Effectuer une vérification par SMS sur le serveur .

4. Recevoir des messages de vérification

Lorsqu'un message de vérification est reçu sur l'appareil de l'utilisateur, les services Play diffuse explicitement sur votre application une intention SmsRetriever.SMS_RETRIEVED_ACTION , qui contient le texte du message. Utilisez un BroadcastReceiver pour recevoir ce message de vérification.

Dans le gestionnaire onReceive BroadcastReceiver , récupérez le texte du message de vérification à partir des extras de l'Intention:

/**
 * 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:
          // Get SMS message contents
          String message = (String) extras.get(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'intention 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 votre application, comme dans l'exemple suivant, ou dynamiquement à 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 vérification à votre serveur

Maintenant que vous avez le texte du message de vérification, 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 les avez implémentés 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é vérifié.

Facultatif: enregistrez le numéro de téléphone avec Smart Lock pour les mots de passe

En option, une fois que l'utilisateur a vérifié son numéro de téléphone, vous pouvez l'inviter à enregistrer ce compte de numéro de téléphone avec Smart Lock pour les mots de passe afin qu'il soit disponible automatiquement dans d'autres applications et sur d'autres appareils sans avoir à taper ou sélectionner à nouveau le numéro de téléphone. :

Credential credential = new Credential.Builder(phoneNumberString)
        .setAccountType("https://signin.example.com")  // a URL specific to the app
        .setName(displayName)  // optional: a display name if available
        .build();
Auth.CredentialsApi.save(apiClient, credential).setResultCallback(
            new ResultCallback() {
                public void onResult(Result result) {
                    Status status = result.getStatus();
                    if (status.isSuccess()) {
                        Log.d(TAG, "SAVE: OK");  // already saved
                    } else if (status.hasResolution()) {
                        // Prompt the user to save
                        status.startResolutionForResult(this, RC_SAVE);
                    }
                }
            });

Ensuite, une fois que l'utilisateur a réinstallé l'application ou installé l'application sur un nouvel appareil, vous pouvez récupérer le numéro de téléphone enregistré sans avoir à demander à nouveau à l'utilisateur son numéro de téléphone:

// On the next install, retrieve the phone number
mCredentialRequest = new CredentialRequest.Builder()
    .setAccountTypes("https://signin.example.com")  // the URL specific to the developer
    .build();
Auth.CredentialsApi.request(apiClient, mCredentialRequest).setResultCallback(
    new ResultCallback<CredentialRequestResult>() {
        public void onResult(CredentialRequestResult credentialRequestResult) {
            if (credentialRequestResult.getStatus().isSuccess()) {
                credentialRequestResult.getCredential().getId();  // this is the phone number
            }
        }
    });

// Then, initiate verification and sign the user in (same as original verification logic)