Wenn Sie Telefonnummern automatisch bestätigen lassen 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 die Bestätigung der Telefonnummer in einer Android-App starten möchten, senden Sie die Telefonnummer an Ihren Überprüfungsserver und rufen die SMS Retriever API auf, um auf eine SMS mit einem Einmalcode für Ihre App zu warten. Nachdem Sie die Nachricht erhalten haben, senden Sie den Einmalcode an Ihren Server zurück, um den Überprüfungsprozess abzuschließen.
Führen Sie die Schritte in den folgenden Abschnitten aus, um Ihre App vorzubereiten.
Voraussetzungen für Apps
Achten Sie darauf, dass in der Build-Datei Ihrer App die folgenden Werte verwendet werden:
- minSdkVersion 19 oder höher
- compileSdkVersion 28 oder höher
Eigene App konfigurieren
Fügen Sie in der build.gradle-Datei auf Projektebene in den Bereichen buildscript und allprojects das Maven-Repository von Google 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 der Gradle-Build-Datei Ihres Moduls hinzu, die normalerweise app/build.gradle ist:
dependencies {
implementation 'com.google.android.gms:play-services-auth:22.0.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:18.3.1'
}
Telefonnummer des Nutzers abrufen
Du kannst die Telefonnummer des Nutzers auf die für deine App am besten geeignete Weise abrufen. Oft ist es am besten, den Nutzer über die Hinweis-Auswahl aufzufordern, eine der auf dem Gerät gespeicherten Telefonnummern auszuwählen, damit er die Telefonnummer nicht manuell eingeben muss. So verwenden Sie die Hinweisauswahl:
// 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-Abruf starten
Wenn du die Telefonnummer des Nutzers bestätigen möchtest, rufe eine Instanz des SmsRetrieverClient-Objekts ab, rufe startSmsRetriever auf und hänge Erfolgs- und Fehler-Listener an die SMS-Abrufaufgabe 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 SMS-Abrufaufgabe wartet bis zu fünf Minuten auf eine SMS, die einen eindeutigen String enthält, der Ihre App identifiziert.
Senden Sie die Telefonnummer an Ihren Server.
Nachdem du die Telefonnummer des Nutzers erhalten und mit dem Abhören von SMS-Nachrichten begonnen hast, sende die Telefonnummer des Nutzers mit einer beliebigen Methode (normalerweise mit einer HTTPS-POST-Anfrage) an deinen Bestätigungsserver.
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 erhalten
Wenn eine Bestätigungsnachricht auf dem Gerät des Nutzers eingeht, senden die Play-Dienste explizit einen SmsRetriever.SMS_RETRIEVED_ACTION-Intent an deine App, der den Text der Nachricht enthält. Verwenden Sie eine BroadcastReceiver, um diese Bestätigungsnachricht zu erhalten.
Rufe 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 dieses BroadcastReceiver zu registrieren:
- Intent-Filter:
com.google.android.gms.auth.api.phone.SMS_RETRIEVED(der Wert derSmsRetriever.SMS_RETRIEVED_ACTION-Konstante) - Berechtigung:
com.google.android.gms.auth.api.phone.permission.SEND(der Wert der KonstanteSmsRetriever.SEND_PERMISSION)
Du kannst den Empfänger in der AndroidManifest.xml-Datei deiner 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>
Senden Sie den Einmalcode aus der Bestätigungsnachricht an Ihren Server.
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 abzurufen. 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 dein Server den Einmalcode empfängt, wird aufgezeichnet, dass die Telefonnummer bestätigt wurde.