Wenn Sie die Anmeldung mit Google-Konten unterstützen, können Sie mit dem One Tap-Client Ihren Nutzern auch eine reibungslose Kontoerstellung ermöglichen, bei der sie die App nicht 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 für Ihre App zu erstellen. Wenn der Nutzer fortfährt, erhalten Sie ein ID-Token mit grundlegenden Profilinformationen wie Name, Profilbild und bestätigte E-Mail-Adresse, mit denen Sie das neue Konto erstellen können.
Die Implementierung der Kontoerstellung über One Tap umfasst zwei Teile:
- Integration des One Tap-Clients in Ihre App, wie auf dieser Seite beschrieben. Das Verfahren ist größtenteils dasselbe wie bei der Anmeldung über One Tap, es gibt jedoch einige Unterschiede bei der Konfiguration.
- Fügen Sie Ihrem Backend die Möglichkeit hinzu, Nutzerkonten aus Google-ID-Tokens zu erstellen. Das wird unter ID-Tokens im Backend verwenden beschrieben.
Wo sollte ich die Registrierung über One Tap verwenden?
Die Registrierung über One Tap ist am wirkungsvollsten, wenn die Anmeldung neue Funktionen ermöglicht. Versuchen Sie zuerst, den Nutzer mit gespeicherten Anmeldedaten anzumelden. Wenn keine gespeicherten Anmeldedaten gefunden werden, bieten Sie an, ein neues Konto für den Nutzer zu erstellen.
Hinweis
Richten Sie Ihr Google API Console-Projekt und Ihr Android-Projekt wie unter Mit der Anmeldung über One Tap beginnen beschrieben ein.
1. One Tap-Client konfigurieren
So konfigurieren Sie den One Tap-Client für die Kontoerstellung:
- Aktivieren Sie keine Anfragen für Passwortanmeldedaten. Die Registrierung über One Tap ist nur mit der tokenbasierten Authentifizierung möglich.
Aktivieren Sie Google-ID-Token-Anfragen mit
setGoogleIdTokenRequestOptions()und diesen Einstellungen:- Legen Sie die Server-Client-ID auf die ID fest, die Sie in der Google APIs Console erstellt haben. Das 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. Filtern Sie also nicht nach autorisierten Konten.
- 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 nachverfolgen
Sie sollten im Blick behalten, ob der Nutzer die Registrierung mit nur einem Fingertipp bereits abgelehnt hat, indem er die Aufforderung geschlossen oder außerhalb davon getippt hat. Das kann so einfach wie eine boolesche Property Ihrer Aktivität sein. One Tap-UI nicht mehr anzeigen
3. UI für die Registrierung über One Tap anzeigen
Wenn der Nutzer die Verwendung von One Tap zum Erstellen eines neuen Kontos nicht abgelehnt hat, rufen Sie die Methode beginSignIn() des Client-Objekts auf und hängen Sie Listener an das zurückgegebene Task an. Apps führen diesen Schritt in der Regel aus, wenn bei einer Anfrage zur Anmeldung über One Tap keine gespeicherten Anmeldedaten gefunden werden. Das heißt, im Fehler-Listener der Anmeldeanfrage.
Der One Tap-Client ruft den Erfolgslistener auf, wenn der Nutzer ein oder mehrere Google-Konten auf dem Gerät eingerichtet hat. Rufen Sie im Erfolgs-Listener den ausstehenden Intent aus dem Task-Ergebnis ab und übergeben Sie ihn 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 Fehler-Listener auf. In diesem Fall ist keine Aktion erforderlich. Sie können einfach die Ansicht der App für abgemeldete Nutzer weiter anzeigen und der Nutzer kann sich über Ihren normalen Vorgang 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 Registrierung über One Tap wird Ihrer App über die onActivityResult()-Methode Ihrer Activity gemeldet. 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 mit beiden Möglichkeiten umgehen können.
Konto mit einem Google-ID-Token erstellen
Wenn sich der Nutzer mit einem Google-Konto registriert hat, können Sie ein ID-Token für den Nutzer abrufen, indem Sie die Intent-Daten von onActivityResult() an die Methode getSignInCredentialFromIntent() des One Tap-Clients übergeben. Die Anmeldedaten haben eine googleIdToken-Property, die nicht null ist.
Verwenden Sie das ID-Token, um ein Konto in Ihrem Backend zu erstellen (siehe Authentifizierung bei einem Backend mit ID-Tokens) und den Nutzer anzumelden.
Die Anmeldedaten enthalten auch alle zusätzlichen Details, die Sie angefordert haben, 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 ausgelöst.
In diesem Fall sollten Sie die Benutzeroberfläche für die Anmeldung über One Tap vorübergehend nicht mehr anzeigen, damit Ihre Nutzer nicht durch wiederholte Aufforderungen genervt werden. Im folgenden Beispiel wird dies erreicht, indem eine Property für die Activity festgelegt wird, mit der bestimmt wird, ob dem Nutzer die Anmeldung über One Tap angeboten werden soll. Sie können jedoch auch einen Wert in SharedPreferences speichern oder eine andere Methode verwenden.
Es ist wichtig, dass Sie Ihre eigene Ratenbegrenzung für Anmeldeaufforderungen über One Tap implementieren. Wenn Sie das nicht tun und ein Nutzer mehrere Aufforderungen hintereinander abbricht, wird der Nutzer 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 Registrierung über One Tap abschließt, erhalten Sie ein Google-ID-Token, das einige grundlegende Profilinformationen enthält: die E-Mail-Adresse, den vollständigen Namen und die Profilbild-URL des Nutzers. Für viele Apps reichen diese Informationen aus, um den Nutzer im Backend zu authentifizieren und ein neues Konto zu erstellen.
Wenn Sie zusätzliche Informationen zum Erstellen des Kontos benötigen, z. B. das Geburtsdatum des Nutzers, präsentieren Sie dem Nutzer einen Ablauf für die Registrierungsdetails, in dem Sie diese zusätzlichen Informationen anfordern. Senden Sie sie dann an Ihr Backend, um die Kontoerstellung abzuschließen.