SMS-Bestätigung in einer Android-App anfordern

Um Telefonnummern automatisch zu bestätigen, müssen Sie sowohl den Client als auch des Bestätigungsvorgangs an. In diesem Dokument wird beschrieben, wie Sie Implementieren des Client-Teils in einer Android-App

Um den Vorgang zur Bestätigung der Telefonnummer in einer Android-App zu starten, senden Sie die Telefonnummer an Ihren Bestätigungsserver senden und die SMS Retriever API aufrufen, auf eine SMS mit einem Einmalcode für Ihre App warten. Nachdem Sie die Nachricht erhalten, senden Sie den einmaligen Code an Ihren Server zurück, des Überprüfungsverfahrens.

Hinweis

Führen Sie die Schritte in den folgenden Abschnitten aus, um Ihre App vorzubereiten.

Voraussetzungen für Apps

Achten Sie darauf, dass die Build-Datei Ihrer App die folgenden Werte enthält:

  • minSdkVersion 19 oder höher
  • CompilSdkVersion von 28 oder höher

Eigene App konfigurieren

Fügen Sie in die build.gradle-Datei auf Projektebene das Maven-Repository von Google ein. und Maven Central Repository in den Abschnitten buildscript und allprojects:

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

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

Abhängigkeit für Google Play-Dienste hinzufügen für die SMS Retriever API in die Gradle-Build-Datei Ihres Moduls. Dies ist üblicherweise 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. Telefonnummer des Nutzers ermitteln

Sie können die Telefonnummer des Nutzers auf eine beliebige Art und Weise abrufen, die für Ihr Unternehmen geeignet ist. Häufig ist es am besten, die Tippauswahl zu verwenden, um den zwischen den auf dem Gerät gespeicherten Telefonnummern wählen und eine Telefonnummer manuell eingeben müssen. So verwenden Sie die Tippauswahl:

// 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. SMS-Abruf starten

Wenn Sie die Telefonnummer des Nutzers bestätigen möchten, rufen Sie eine Instanz des SmsRetrieverClient-Objekt, rufen Sie startSmsRetriever auf und hängen Sie Erfolgs- und Fehler-Listener für die SMS-Abrufaufgabe:

// 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
    // ...
  }
});

Die Aufgabe zum Abrufen von SMS wartet bis zu fünf Minuten auf eine SMS. die einen eindeutigen String enthält, der Ihre App identifiziert.

3. Telefonnummer an den Server senden

Nachdem Sie die Telefonnummer des Nutzers erhalten und mit dem Abhören von SMS begonnen haben können Sie die Telefonnummer des Nutzers über eine beliebige -Methode (normalerweise mit einer HTTPS-POST-Anfrage).

Ihr Server generiert eine Bestätigungsnachricht und sendet sie per SMS an das Telefon. die von Ihnen angegebene Zahl. Siehe SMS-Bestätigung auf dem Server durchführen

4. Bestätigungsnachrichten erhalten

Wenn eine Bestätigungsnachricht auf dem Gerät des Nutzers eingeht, werden die Google Play-Dienste sendet explizit einen SmsRetriever.SMS_RETRIEVED_ACTION-Intent an Ihre App. das den Text der Nachricht enthält. BroadcastReceiver zum Empfangen verwenden diese Bestätigungsnachricht senden.

Rufen Sie im onReceive-Handler der BroadcastReceiver den Text der Bestätigungsnachricht (und optional die Absenderadresse) aus dem 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;
      }
    }
  }
}

BroadcastReceiver mit Intent-Filter registrieren com.google.android.gms.auth.api.phone.SMS_RETRIEVED (Wert des Parameters SmsRetriever.SMS_RETRIEVED_ACTION Konstante) und die Berechtigung com.google.android.gms.auth.api.phone.permission.SEND (Wert des SmsRetriever.SEND_PERMISSION Konstante) in der AndroidManifest.xml Ihrer App wie im folgenden Beispiel gezeigt, oder dynamisch mit 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. Einmalcode aus der Bestätigungsnachricht an Ihren Server senden

Nachdem Sie nun den Text der Bestätigungsnachricht haben, verwenden Sie einen regulären Ausdruck. oder eine andere Logik verwenden, um den einmaligen Code aus der Nachricht zu erhalten. Das Format des einmaliger Code hängt davon ab, wie Sie ihn in Ihrem Server implementiert haben.

Senden Sie zum Schluss den Einmalcode über eine sichere Verbindung an Ihren Server. Wann? erhält Ihr Server den einmaligen Code, er zeichnet auf, dass die Telefonnummer überprüft wurden.