Solicitar a verificação por SMS em um app Android

Para verificar os números de telefone automaticamente, é necessário implementar as APIs cliente e de servidor do fluxo de verificação. Este documento descreve como implementar a parte do cliente em um app Android.

Para iniciar o fluxo de verificação do número de telefone em um app Android, envie o número de telefone ao seu servidor de verificação e ligue para a API SMS Retriever para começar. detectar uma mensagem SMS contendo um código de uso único para seu aplicativo. Depois de receber a mensagem, você enviará o código de uso único de volta ao seu servidor para concluir o processo de verificação.

Antes de começar

Para preparar o app, siga as etapas nas seções a seguir.

Pré-requisitos do app

O arquivo de build do app precisa usar estes valores:

  • Uma minSdkVersion de 19 ou mais
  • Uma compileSdkVersion 28 ou mais recente.

Configurar o app

No arquivo build.gradle no nível do projeto, inclua o repositório Maven do Google. e o repositório Maven central nas seções buildscript e allprojects:

buildscript {
    repositories {
        google()
        mavenCentral()
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

Adicionar a dependência do Google Play Services para a API SMS Retriever ao arquivo de build do Gradle do seu módulo, que é comumente 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. Conseguir o número de telefone do usuário

Você pode obter o número de telefone do usuário da maneira que for mais apropriada para seu app. Muitas vezes, é a melhor experiência do usuário usar o seletor de dicas para solicitar que o que o usuário escolha entre os números de telefone armazenados no dispositivo e, assim, evite ter que digitar manualmente um número de telefone. Para usar o seletor de dicas:

// 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. Iniciar a recuperação de SMS

Quando estiver tudo pronto para verificar o número de telefone do usuário, acesse uma instância do objeto SmsRetrieverClient, chame startSmsRetriever, anexe o sucesso e listeners de falha para a tarefa de recuperação 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
    // ...
  }
});

A tarefa de recuperação de SMS vai detectar uma mensagem SMS por até cinco minutos que contém uma string exclusiva que identifica seu app.

3. Enviar o número de telefone para seu servidor

Depois de conseguir o número de telefone do usuário e começar a ouvir SMS envie o número de telefone do usuário para seu servidor de verificação usando qualquer (geralmente com uma solicitação POST HTTPS).

O servidor gera uma mensagem de verificação e a envia por SMS para o telefone número especificado. Consulte Executar a verificação por SMS no servidor.

4. Receber mensagens de verificação

Quando uma mensagem de verificação é recebida no dispositivo do usuário, o Google Play Services transmite explicitamente ao app uma intent SmsRetriever.SMS_RETRIEVED_ACTION; que contém o texto da mensagem. Use um BroadcastReceiver para receber esta mensagem de verificação.

No gerenciador onReceive do BroadcastReceiver, acesse o texto do de verificação (e opcionalmente o endereço do remetente) do e-mail 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;
      }
    }
  }
}

Registre este BroadcastReceiver com o filtro de intent com.google.android.gms.auth.api.phone.SMS_RETRIEVED (o valor do atributo SmsRetriever.SMS_RETRIEVED_ACTION) e a permissão com.google.android.gms.auth.api.phone.permission.SEND (o valor do atributo SmsRetriever.SEND_PERMISSION) no AndroidManifest.xml do app como no exemplo a seguir, ou dinamicamente usando 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. Envie o código de uso único da mensagem de verificação para seu servidor

Agora que você tem o texto da mensagem de verificação, use uma expressão regular ou alguma outra lógica para receber o código de uso único da mensagem. O formato do código único depende de como você os implementou no servidor.

Por fim, envie o código de uso único para seu servidor por uma conexão segura. Quando seu servidor recebe o código de uso único, ele registra que o número de telefone após a verificação.