Wenn Sie Telefonnummern automatisch bestätigen möchten, müssen Sie sowohl den Client- als auch den Serverteil des Bestätigungsablaufs implementieren. In diesem Dokument wird beschrieben, wie Sie den Clientteil in einer Android-App implementieren.
Wenn Sie den Bestätigungsablauf für Telefonnummern in einer Android-App starten möchten, senden Sie die Telefonnummer an Ihren Bestätigungsserver und rufen die SMS Retriever API auf, um nach einer SMS mit einem Einmalcode für Ihre App zu suchen. Nachdem Sie die Nachricht erhalten haben, senden Sie den Einmalcode zurück an Ihren Server, um den Bestätigungsvorgang abzuschließen.
Führen Sie die Schritte in den folgenden Abschnitten aus, um Ihre App vorzubereiten.
Voraussetzungen für die App
Achten Sie darauf, dass in der Build-Datei Ihrer App die folgenden Werte verwendet werden:
- Ein minSdkVersion-Wert von 19 oder höher
- Ein compileSdkVersion-Wert von 28 oder höher
Eigene App konfigurieren
Fügen Sie in der Datei auf Projektebene build.gradle in den Bereichen
buildscript und allprojects das Maven-Repository von
Google's und das Maven Central Repository ein:
buildscript {
repositories {
google()
mavenCentral()
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
Fügen Sie die Google Play-Dienste-Abhängigkeit für die SMS Retriever API zu Ihrer
Gradle-Build-Datei Ihres Moduls hinzu, die üblicherweise app/build.gradle ist:
dependencies {
implementation 'com.google.android.gms:play-services-auth:21.6.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:18.3.0'
}
Telefonnummer des Nutzers abrufen
Sie können die Telefonnummer des Nutzers auf jede für Ihre App geeignete Weise abrufen. Oft ist es am besten, den Nutzer mit der Hinweis-Auswahl aufzufordern, eine der auf dem Gerät gespeicherten Telefonnummern auszuwählen, damit er keine Telefonnummer manuell eingeben muss. So verwenden Sie die Hinweis-Auswahl:
// 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
}
}
}
SMS Retriever starten
Wenn Sie die Telefonnummer des Nutzers bestätigen möchten, rufen Sie eine Instanz des SmsRetrieverClient-Objekts ab, rufen Sie startSmsRetriever auf und fügen Sie Listener für Erfolg und Fehler an die Aufgabe zum Abrufen von SMS an:
// 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 using 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 sucht bis zu fünf Minuten lang nach einer SMS mit einem eindeutigen String, der Ihre App identifiziert.
Telefonnummer an Ihren Server senden
Nachdem Sie die Telefonnummer des Nutzers abgerufen und mit dem Suchen nach SMS begonnen haben, senden Sie die Telefonnummer des Nutzers mit einer beliebigen Methode an Ihren Bestätigungsserver (in der Regel mit einer HTTPS-POST-Anfrage).
Ihr Server generiert eine Bestätigungsnachricht und sendet sie per SMS an die von Ihnen angegebene Telefonnummer. Weitere Informationen finden Sie unter SMS-Bestätigung auf dem Server durchführen.
Bestätigungsnachrichten empfangen
Wenn auf dem Gerät des Nutzers eine Bestätigungsnachricht eingeht, sendet Play-Dienste explizit einen SmsRetriever.SMS_RETRIEVED_ACTION-Intent an Ihre App, der den Text der Nachricht enthält. Verwenden Sie einen BroadcastReceiver, um diese Bestätigungsnachricht zu empfangen.
Rufen Sie im onReceive-Handler des BroadcastReceiver den Text der Bestätigungsnachricht (und optional die Absenderadresse) aus den Extras des Intents ab:
/**
* BroadcastReceiver to wait for SMS messages. This can be registered either
* in the AndroidManifest or at runtime. Filters 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;
}
}
}
}
Verwenden Sie Folgendes, um diesen BroadcastReceiver zu registrieren:
- Intent-Filter:
com.google.android.gms.auth.api.phone.SMS_RETRIEVED(der Wert der KonstanteSmsRetriever.SMS_RETRIEVED_ACTION) - Berechtigung:
com.google.android.gms.auth.api.phone.permission.SEND(der Wert der KonstanteSmsRetriever.SEND_PERMISSION)
Sie können den Empfänger in der AndroidManifest.xml-Datei Ihrer App registrieren, wie im folgenden Beispiel, 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>
Einmalcode aus der Bestätigungsnachricht an Ihren Server senden
Nachdem Sie den Text der Bestätigungsnachricht erhalten haben, verwenden Sie einen regulären Ausdruck oder eine andere Logik, um den Einmalcode aus der Nachricht zu extrahieren. Das Format des Einmalcodes hängt davon ab, wie Sie ihn auf Ihrem Server implementiert haben.
Senden Sie den Einmalcode schließlich über eine sichere Verbindung an Ihren Server. Wenn Ihr Server den Einmalcode empfängt, wird aufgezeichnet, dass die Telefonnummer bestätigt wurde.