Para verificar automáticamente los números de teléfono, debes implementar el cliente y las partes del servidor del flujo de verificación. En este documento, se describe cómo implementar la parte del cliente en una app para Android.
Para iniciar el flujo de verificación del número de teléfono en una app para Android, debes enviar el número de teléfono al servidor de verificación y llamar a la API de SMS Retriever para comenzar a la espera de un mensaje SMS con un código de uso único para tu app. Después de recibes el mensaje, debes enviar el código único a tu servidor para que lo complete el proceso de verificación.
Antes de comenzar
Para preparar tu app, completa los pasos que se indican en las siguientes secciones.
Requisitos previos de la app
Asegúrate de que el archivo de compilación de tu app use los siguientes valores:
- Una minSdkVersion de 19 o más
- Una compileSdkVersion 28 o una posterior
Cómo configurar tu app
En el archivo build.gradle de nivel de proyecto, incluye el repositorio Maven de Google.
y Repositorio central de Maven
en las secciones buildscript
y allprojects
:
buildscript {
repositories {
google()
mavenCentral()
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
Agrega la dependencia de Servicios de Google Play
para la API de SMS Retriever al archivo de compilación de Gradle de tu módulo.
que suele ser 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. Obtén el número de teléfono del usuario
Puedes obtener el número de teléfono del usuario de la forma que te resulte apropiada para tu . Por lo general, la mejor experiencia del usuario es usar el selector de sugerencias que el usuario elija entre los números de teléfono almacenados en el dispositivo y, así, evitar tener que escribir manualmente un número de teléfono. Para usar el selector de sugerencias, haz lo siguiente:
// 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. Cómo iniciar el recuperador de SMS
Cuando tengas todo listo para verificar el número de teléfono del usuario, obtén una instancia del
SmsRetrieverClient
, llama a startSmsRetriever
y adjunta correctamente
objetos de escucha de fallas a la tarea de recuperación 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 tarea de recuperación de SMS escuchará un mensaje SMS hasta cinco minutos que contenga una cadena única que identifique a tu app.
3. Envía el número de teléfono a tu servidor
Después de obtener el número de teléfono del usuario y comenzar a escuchar SMS envía el número de teléfono del usuario a tu servidor de verificación mediante cualquier (generalmente con una solicitud POST HTTPS).
Tu servidor genera un mensaje de verificación y lo envía por SMS al teléfono. el número que especificaste. Consulta Cómo realizar una verificación por SMS en el servidor.
4. Recibir mensajes de verificación
Cuando se recibe un mensaje de verificación en el dispositivo del usuario, los Servicios de Play
transmite de forma explícita a tu app un intent SmsRetriever.SMS_RETRIEVED_ACTION
,
que incluye el texto del mensaje. Usa un BroadcastReceiver
para recibir
este mensaje de verificación.
En el controlador onReceive
de BroadcastReceiver
, obtén el texto del
mensaje de verificación (y, opcionalmente, la dirección del remitente) del archivo
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;
}
}
}
}
Registra este BroadcastReceiver
con el filtro de intents
com.google.android.gms.auth.api.phone.SMS_RETRIEVED
(el valor de la
SmsRetriever.SMS_RETRIEVED_ACTION
) y el permiso
com.google.android.gms.auth.api.phone.permission.SEND
(el valor de la
SmsRetriever.SEND_PERMISSION
constante) en la AndroidManifest.xml
de la app
como en el siguiente ejemplo, o de forma dinámica con 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. Envía el código de uso único del mensaje de verificación a tu servidor
Ahora que tienes el texto del mensaje de verificación, usa una expresión regular o alguna otra lógica para obtener el código único del mensaje. El formato de la de uso único depende de cómo los implementaste en tu servidor.
Por último, envía el código único a tu servidor a través de una conexión segura. Cuándo tu servidor recibe el código único, registra que el número de teléfono que se verificó.