Wenn Sie die Anmeldung über Google-Konten unterstützen, können Sie mit dem One Tap-Anmeldeclient Ihren Nutzern auch eine reibungslose Kontoerstellung ermöglichen, ohne dass sie den Kontext Ihrer App verlassen müssen.
Wenn Sie die One Tap-Benutzeroberfläche anzeigen, werden Nutzer aufgefordert, mit einem der Google-Konten auf ihrem Gerät ein neues Konto in Ihrer App zu erstellen. Wenn der Nutzer fortfahren möchte, erhalten Sie ein ID-Token mit grundlegenden Profilinformationen wie Name, Profilbild und bestätigter E-Mail-Adresse, mit dem Sie das neue Konto erstellen können.
Die Implementierung der Kontoerstellung über One Tap besteht aus zwei Teilen:
- Integrieren Sie den One Tap-Client in Ihre App. Wie das geht, wird auf dieser Seite beschrieben. Das funktioniert im Wesentlichen genauso wie bei der Anmeldung mit nur einem Tastenanschlag, es gibt jedoch einige Unterschiede bei der Konfiguration.
- Fügen Sie Ihrem Backend die Möglichkeit hinzu, Nutzerkonten aus Google-ID-Tokens zu erstellen. Weitere Informationen finden Sie unter ID-Tokens im Backend verwenden.
Wo sollte ich die Registrierung über One Tap verwenden?
Die Registrierung per One Tap ist am effektivsten, wenn Nutzer durch die Anmeldung neue Funktionen nutzen können. Versuchen Sie zuerst, den Nutzer mit gespeicherten Anmeldedaten anzumelden. Wenn keine gespeicherten Anmeldedaten gefunden werden, biete an, ein neues Konto für den Nutzer zu erstellen.
Hinweis
Richten Sie Ihr Google API Console-Projekt und Ihr Android-Projekt wie unter Einrichtung der Anmeldung mit nur einem Tastenanschlag beschrieben ein.
1. One Tap-Client konfigurieren
So konfigurieren Sie den One Tap-Client für die Kontoerstellung:
- Aktivieren Sie keine Anfragen für Passwort-Anmeldedaten. Die Registrierung per One Tap ist nur mit tokenbasierter Authentifizierung möglich.
Aktiviere Google-ID-Token-Anfragen mit
setGoogleIdTokenRequestOptions()
und den folgenden Einstellungen:- Legen Sie die Server-Client-ID auf die ID fest, die Sie in der Google APIs Console erstellt haben. Hinweis: Dies ist die Client-ID Ihres Servers, nicht Ihre Android-Client-ID.
- Konfigurieren Sie den Client so, dass alle Google-Konten auf dem Gerät angezeigt werden. Das heißt, es darf nicht nach autorisierten Konten gefiltert werden.
- Optional können Sie auch die bestätigte Telefonnummer für das Konto anfordern.
Java
public class YourActivity extends AppCompatActivity { // ... private SignInClient oneTapClient; private BeginSignInRequest signUpRequest; @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); oneTapClient = Identity.getSignInClient(this); signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build(); // ... } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private lateinit var oneTapClient: SignInClient private lateinit var signUpRequest: BeginSignInRequest override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) oneTapClient = Identity.getSignInClient(this) signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions( BeginSignInRequest.GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build() // ... } // ... }
2. Kündigung der One Tap-Benutzeroberfläche verfolgen
Sie sollten verfolgen, ob der Nutzer die Anmeldung mit One Tap bereits abgelehnt hat, indem er entweder die Aufforderung schließt oder außerhalb davon tippt. Das kann so einfach wie eine boolesche Property Ihrer Aktivität sein. Weitere Informationen finden Sie unten im Abschnitt Einrichtungsoberfläche für die Einrichtung per Schnelltippen nicht mehr anzeigen.
3. Benutzeroberfläche für die Registrierung über One Tap anzeigen
Wenn der Nutzer die Verwendung von One Tap zum Erstellen eines neuen Kontos nicht abgelehnt hat, rufe die Methode beginSignIn()
des Clientobjekts auf und binde Listener an die zurückgegebene Task
an. Apps führen diesen Schritt in der Regel aus, wenn bei einer Anmeldung mit nur einem Tastendruck keine gespeicherten Anmeldedaten gefunden werden. Das geschieht im Fehlerempfänger der Anmeldeanfrage.
Der One Tap-Client ruft den Erfolgs-Listener auf, wenn der Nutzer mindestens ein Google-Konto auf dem Gerät eingerichtet hat. Rufen Sie im Erfolgs-Listener die ausstehende Intent aus dem Task
-Ergebnis ab und übergeben Sie sie an startIntentSenderForResult()
, um die One-Tap-Benutzeroberfläche zu starten.
Wenn der Nutzer keine Google-Konten auf dem Gerät hat, ruft der One Tap-Client den Fehlerlistener auf. In diesem Fall sind keine Maßnahmen erforderlich: Sie können die App einfach weiterhin für Nutzer anzeigen, die nicht angemeldet sind, und der Nutzer kann sich mit dem normalen Ablauf zur Kontoerstellung registrieren.
Java
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this, new OnSuccessListener<BeginSignInResult>() {
@Override
public void onSuccess(BeginSignInResult result) {
try {
startIntentSenderForResult(
result.getPendingIntent().getIntentSender(), REQ_ONE_TAP,
null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Couldn't start One Tap UI: " + e.getLocalizedMessage());
}
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.getLocalizedMessage());
}
});
Kotlin
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this) { result ->
try {
startIntentSenderForResult(
result.pendingIntent.intentSender, REQ_ONE_TAP,
null, 0, 0, 0)
} catch (e: IntentSender.SendIntentException) {
Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
}
}
.addOnFailureListener(this) { e ->
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.localizedMessage)
}
4. Antwort des Nutzers verarbeiten
Die Antwort des Nutzers auf die Aufforderung zur Anmeldung mit nur einem Fingertipp wird an Ihre App gesendet. Dazu wird die onActivityResult()
-Methode Ihrer Aktivität verwendet. Wenn der Nutzer ein Konto erstellt hat, ist das Ergebnis ein Google-ID-Token. Wenn der Nutzer die Registrierung abgelehnt hat, indem er die One Tap-Benutzeroberfläche geschlossen oder außerhalb davon getippt hat, wird das Ergebnis mit dem Code RESULT_CANCELED
zurückgegeben. Ihre App muss beide Möglichkeiten berücksichtigen.
Konto mit einem Google-ID-Token erstellen
Wenn sich der Nutzer mit einem Google-Konto registriert hat, kannst du ein ID-Token für den Nutzer abrufen, indem du die Intent-Daten von onActivityResult()
an die getSignInCredentialFromIntent()
-Methode des One Tap-Clients weitergibst. Die Anmeldedaten haben eine nicht nullwertige googleIdToken
-Eigenschaft.
Verwende das ID-Token, um ein Konto in deinem Backend zu erstellen (siehe Mit ID-Tokens bei einem Backend authentifizieren) und den Nutzer anzumelden.
Die Anmeldedaten enthalten auch alle von Ihnen angeforderten zusätzlichen Details, z. B. die bestätigte Telefonnummer des Kontos, sofern verfügbar.
Java
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data); String idToken = credential.getGoogleIdToken(); if (idToken != null) { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token."); } } catch (ApiException e) { // ... } break; } } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { val credential = oneTapClient.getSignInCredentialFromIntent(data) val idToken = credential.googleIdToken when { idToken != null -> { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token.") } else -> { // Shouldn't happen. Log.d(TAG, "No ID token!") } } } catch (e: ApiException) { // ... } } } // ... }
One Tap-Benutzeroberfläche nicht mehr anzeigen
Wenn der Nutzer die Anmeldung abgelehnt hat, wird beim Aufruf von getSignInCredentialFromIntent()
eine ApiException
mit dem Statuscode CommonStatusCodes.CANCELED
ausgegeben.
In diesem Fall sollten Sie die Benutzeroberfläche für die Anmeldung mit nur einem Fingerabdruck vorübergehend nicht mehr anzeigen, damit Nutzer nicht durch wiederholte Aufforderungen genervt werden. Im folgenden Beispiel wird dazu eine Property für die Aktivität festgelegt, anhand derer entschieden wird, ob dem Nutzer die Anmeldung mit nur einem Tastenanschlag angeboten wird. Sie können aber auch einen Wert in SharedPreferences
speichern oder eine andere Methode verwenden.
Sie müssen Ihre eigenen Ratenbeschränkungen für Aufforderungen zur Anmeldung über One Tap implementieren. Wenn Sie dies nicht tun und ein Nutzer mehrere Aufforderungen hintereinander abbricht, wird er vom One Tap-Client in den nächsten 24 Stunden nicht mehr aufgefordert.
Java
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { // ... } catch (ApiException e) { switch (e.getStatusCode()) { case CommonStatusCodes.CANCELED: Log.d(TAG, "One-tap dialog was closed."); // Don't re-prompt the user. showOneTapUI = false; break; case CommonStatusCodes.NETWORK_ERROR: Log.d(TAG, "One-tap encountered a network error."); // Try again or just ignore. break; default: Log.d(TAG, "Couldn't get credential from result." + e.getLocalizedMessage()); break; } } break; } } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { // ... } catch (e: ApiException) { when (e.statusCode) { CommonStatusCodes.CANCELED -> { Log.d(TAG, "One-tap dialog was closed.") // Don't re-prompt the user. showOneTapUI = false } CommonStatusCodes.NETWORK_ERROR -> { Log.d(TAG, "One-tap encountered a network error.") // Try again or just ignore. } else -> { Log.d(TAG, "Couldn't get credential from result." + " (${e.localizedMessage})") } } } } } } // ... }
Nächste Schritte
Wenn ein Nutzer die Anmeldung mit One Tap durchläuft, erhalten Sie ein Google-ID-Token mit einigen grundlegenden Profilinformationen: der E-Mail-Adresse, dem vollständigen Namen und der URL des Profilbilds des Nutzers. Bei vielen Apps reichen diese Informationen aus, um den Nutzer im Backend zu authentifizieren und ein neues Konto zu erstellen.
Wenn Sie für die Kontoerstellung zusätzliche Informationen benötigen, z. B. das Geburtsdatum des Nutzers, müssen Sie ihm einen Registrierungsvorgang mit den entsprechenden Feldern anzeigen. Senden Sie diese Informationen dann an Ihr Backend, um die Kontoerstellung abzuschließen.