Mit dem Client für die Anmeldung über One Tap können Sie die Berechtigung des Nutzers anfordern, eines der Anmeldedaten abzurufen, die er zuvor verwendet hat, um sich in Ihrer App anzumelden. Diese Anmeldedaten können entweder ein Google-Konto oder eine Kombination aus Nutzername und Passwort sein, die der Nutzer mit Chrome, Android Autofill oder Smart Lock für Passwörter bei Google gespeichert hat.
Wenn die Anmeldedaten erfolgreich abgerufen wurden, können Sie sie verwenden, um den Nutzer ohne Probleme in Ihrer App anzumelden.
Wenn der Nutzer keine Anmeldedaten gespeichert hat, wird keine Benutzeroberfläche angezeigt und Sie können die normale Erfahrung für nicht angemeldete Nutzer anbieten.
Wo sollte ich die Anmeldung über One Tap verwenden?
Wenn Nutzer sich in Ihrer App anmelden müssen, zeigen Sie die One Tap-Benutzeroberfläche auf der Anmeldeseite an. Das kann auch dann hilfreich sein, wenn Sie bereits eine Schaltfläche „Über Google anmelden“ haben. Die One Tap-Benutzeroberfläche kann so konfiguriert werden, dass nur Anmeldedaten angezeigt werden, die der Nutzer zuvor für die Anmeldung verwendet hat. So können Nutzer, die sich nur selten anmelden, daran erinnert werden, wie sie sich das letzte Mal angemeldet haben. Außerdem wird verhindert, dass sie versehentlich neue Konten in Ihrer App erstellen.
Wenn die Anmeldung für Ihre App optional ist, sollten Sie die Anmeldung über One Tap auf allen Seiten verwenden, auf denen die Nutzererfahrung durch die Anmeldung verbessert wird. Wenn Nutzer beispielsweise Inhalte in Ihrer App durchsuchen können, ohne angemeldet zu sein, aber erst nach der Anmeldung Kommentare posten oder Artikel in einen Einkaufswagen legen können, ist das ein sinnvoller Kontext für die Anmeldung über One Tap.
Auch bei Apps, bei denen die Anmeldung optional ist, sollte die Anmeldung über One Tap auf den Anmeldeseiten verwendet werden.
Hinweis
- Richten Sie Ihr Google APIs Console-Projekt und Ihr Android-Projekt wie unter Erste Schritte mit der Anmeldung über One Tap beschrieben ein.
- Wenn Sie die passwortbasierte Anmeldung unterstützen, optimieren Sie Ihre App für Autofill oder verwenden Sie Smart Lock für Passwörter, damit Nutzer ihre Passwörter nach der Anmeldung speichern können.
1. Anmeldung über One Tap-Client konfigurieren
Sie können den Client für die Anmeldung über One Tap so konfigurieren, dass Nutzer sich mit gespeicherten Passwörtern, gespeicherten Google-Konten oder beidem anmelden können. Es wird empfohlen, beides zu unterstützen, um die Kontoerstellung mit einem Klick für neue Nutzer und die automatische oder One Tap-Anmeldung für möglichst viele wiederkehrende Nutzer zu ermöglichen.
Wenn Ihre App die passwortbasierte Anmeldung verwendet, aktivieren Sie Anfragen für Passwörter mit setPasswordRequestOptions().
Wenn Ihre App die Anmeldung über Google verwendet, aktivieren und konfigurieren Sie Anfragen für Google-ID-Tokens mit setGoogleIdTokenRequestOptions():
Legen Sie die Server-Client-ID auf die ID fest, die Sie in der Google APIs Console erstellt haben. Beachten Sie, dass dies die Client-ID Ihres Servers und nicht Ihre Android-Client-ID ist.
Konfigurieren Sie den Client so, dass nach autorisierten Konten gefiltert wird. Wenn Sie diese Option aktivieren, fordert der One Tap-Client Nutzer nur auf, sich mit Google-Konten in Ihrer App anzumelden, die sie bereits in der Vergangenheit verwendet haben. So können sich Nutzer erfolgreich anmelden, wenn sie nicht sicher sind, ob sie bereits ein Konto haben oder welches Google-Konto sie verwendet haben. Außerdem wird verhindert, dass Nutzer versehentlich neue Konten in Ihrer App erstellen.
Wenn Sie Nutzer nach Möglichkeit automatisch anmelden möchten, aktivieren Sie die Funktion mit
setAutoSelectEnabled(). Die automatische Anmeldung ist möglich, wenn die folgenden Kriterien erfüllt sind:- Für Ihre App ist genau ein Anmeldedatum gespeichert. Das heißt, ein gespeichertes Passwort oder ein gespeichertes Google-Konto.
- Der Nutzer hat die automatische Anmeldung in den Einstellungen seines Google-Kontos nicht deaktiviert.
Obwohl optional, empfehlen wir dringend, eine Nonce zu verwenden, um die Anmeldesicherheit zu verbessern und Replay-Angriffe zu vermeiden. Verwenden Sie „setNonce“ , um in jede Anfrage eine Nonce einzufügen. Im Abschnitt Nonce abrufen von SafetyNet finden Sie Vorschläge und weitere Informationen zum Generieren einer Nonce.
Java
public class YourActivity extends AppCompatActivity { // ... private SignInClient oneTapClient; private BeginSignInRequest signInRequest; @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); oneTapClient = Identity.getSignInClient(this); signInRequest = BeginSignInRequest.builder() .setPasswordRequestOptions(PasswordRequestOptions.builder() .setSupported(true) .build()) .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.default_web_client_id)) // Only show accounts previously used to sign in. .setFilterByAuthorizedAccounts(true) .build()) // Automatically sign in when exactly one credential is retrieved. .setAutoSelectEnabled(true) .build(); // ... } // ... }
Kotlin
class YourActivity : AppCompatActivity() { // ... private lateinit var oneTapClient: SignInClient private lateinit var signInRequest: BeginSignInRequest override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) oneTapClient = Identity.getSignInClient(this) signInRequest = BeginSignInRequest.builder() .setPasswordRequestOptions(BeginSignInRequest.PasswordRequestOptions.builder() .setSupported(true) .build()) .setGoogleIdTokenRequestOptions( BeginSignInRequest.GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Only show accounts previously used to sign in. .setFilterByAuthorizedAccounts(true) .build()) // Automatically sign in when exactly one credential is retrieved. .setAutoSelectEnabled(true) .build() // ... } // ... }
2. Auf angemeldeten Nutzer prüfen
Wenn Ihre Aktivität von einem angemeldeten oder nicht angemeldeten Nutzer verwendet werden kann, prüfen Sie den Status des Nutzers, bevor Sie die One Tap-Anmeldeoberfläche anzeigen.
Sie sollten auch nachverfolgen, ob der Nutzer die Verwendung der Anmeldung über One Tap 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. Weitere Informationen finden Sie unten unter One Tap-Benutzeroberfläche nicht mehr anzeigen.
3. Anmeldung über One Tap-Oberfläche anzeigen
Wenn der Nutzer nicht angemeldet ist und die Verwendung der Anmeldung über One Tap noch nicht abgelehnt hat, rufen Sie die Methode beginSignIn() des Clientobjekts auf und fügen Sie Listener an die zurückgegebene Task an. In der Regel geschieht dies in der Methode onCreate() der Aktivität oder nach Seitenübergängen, wenn eine Architektur mit einer einzelnen Aktivität verwendet wird.
Der One Tap-Client ruft den Erfolgslistener auf, wenn der Nutzer gespeicherte Anmeldedaten für Ihre App hat. Rufen Sie im Erfolgslistener den ausstehenden Intent aus dem Task-Ergebnis ab und übergeben Sie ihn an startIntentSenderForResult(), um die One Tap-Anmeldeoberfläche zu starten.
Wenn der Nutzer keine gespeicherten Anmeldedaten hat, ruft der One Tap-Client den Fehlerlistener auf. In diesem Fall ist keine Aktion erforderlich. Sie können einfach die App für nicht angemeldete Nutzer präsentieren. Wenn Sie jedoch die One Tap-Registrierung unterstützen, können Sie diesen Ablauf hier starten, um die Kontoerstellung zu vereinfachen. Weitere Informationen finden Sie unter Neue Konten mit einem Klick erstellen.
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 saved credentials found. Launch the One Tap sign-up flow, or
// do nothing and continue presenting the signed-out UI.
Log.d(TAG, e.getLocalizedMessage());
}
});
Kotlin
oneTapClient.beginSignIn(signInRequest)
.addOnSuccessListener(this) { result ->
try {
startIntentSenderForResult(
result.pendingIntent.intentSender, REQ_ONE_TAP,
null, 0, 0, 0, null)
} catch (e: IntentSender.SendIntentException) {
Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
}
}
.addOnFailureListener(this) { e ->
// No saved credentials found. Launch the One Tap sign-up flow, or
// do nothing and continue presenting the signed-out UI.
Log.d(TAG, e.localizedMessage)
}
4. Antwort des Nutzers verarbeiten
Die Antwort des Nutzers auf die Anmeldung über One Tap-Aufforderung wird Ihrer App über die Methode onActivityResult() Ihrer Activity gemeldet. Wenn der Nutzer sich angemeldet hat, ist das Ergebnis ein gespeichertes Anmeldedatum. Wenn der Nutzer die Anmeldung abgelehnt hat, entweder durch Schließen der One Tap-Benutzeroberfläche oder durch Tippen außerhalb davon, wird das Ergebnis mit dem Code RESULT_CANCELED zurückgegeben. Ihre App muss beide Möglichkeiten verarbeiten können.
Mit abgerufenen Anmeldedaten anmelden
Wenn der Nutzer Anmeldedaten für Ihre App freigegeben hat, können Sie sie abrufen, indem Sie die Intent-Daten von onActivityResult() an die Methode getSignInCredentialFromIntent() des One Tap-Clients übergeben. Das Anmeldedatum hat eine nicht leere googleIdToken-Property, wenn der Nutzer Anmeldedaten für ein Google-Konto für Ihre App freigegeben hat, oder eine nicht leere password-Property, wenn der Nutzer ein gespeichertes Passwort freigegeben hat.
Verwenden Sie die Anmeldedaten, um sich im Backend Ihrer App zu authentifizieren.
- Wenn ein Nutzername und ein Passwort abgerufen wurden, verwenden Sie sie, um sich auf dieselbe Weise anzumelden, als hätte der Nutzer sie manuell angegeben.
Wenn Anmeldedaten für ein Google-Konto abgerufen wurden, verwenden Sie das ID-Token, um sich im Backend zu authentifizieren. Wenn Sie eine Nonce verwenden, um Replay-Angriffe zu vermeiden, prüfen Sie den Antwortwert auf Ihrem Backend-Server. Weitere Informationen finden Sie unter Mit ID-Tokens im Backend authentifizieren.
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(); String username = credential.getId(); String password = credential.getPassword(); if (idToken != null) { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token."); } else if (password != null) { // Got a saved username and password. Use them to authenticate // with your backend. Log.d(TAG, "Got password."); } } 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 val username = credential.id val password = credential.password when { idToken != null -> { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token.") } password != null -> { // Got a saved username and password. Use them to authenticate // with your backend. Log.d(TAG, "Got password.") } else -> { // Shouldn't happen. Log.d(TAG, "No ID token or password!") } } } catch (e: ApiException) { // ... } } } } // ... }
One Tap-Benutzeroberfläche nicht mehr anzeigen
Wenn der Nutzer die Anmeldung abgelehnt hat, löst der Aufruf von getSignInCredentialFromIntent() eine ApiException mit dem Statuscode CommonStatusCodes.CANCELED aus.
In diesem Fall sollten Sie die One Tap-Anmeldeoberfläche vorübergehend deaktivieren, damit Nutzer nicht wiederholt aufgefordert 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. Andernfalls wird der Nutzer 24 Stunden lang nicht mehr vom One Tap-Client aufgefordert, wenn er mehrere Aufforderungen hintereinander ablehnt.
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})") } } } } } } // ... }
5. Abmeldung verarbeiten
Wenn sich ein Nutzer von Ihrer App abmeldet, rufen Sie die Methode signOut() des One Tap-Clients auf.
Durch den Aufruf von signOut() wird die automatische Anmeldung deaktiviert, bis sich der Nutzer wieder anmeldet.
Auch wenn Sie die automatische Anmeldung nicht verwenden, ist dieser Schritt wichtig, da dadurch sichergestellt wird, dass beim Abmelden von Nutzern aus Ihrer App auch der Authentifizierungsstatus aller von Ihnen verwendeten Play-Dienste-APIs zurückgesetzt wird.
Nächste Schritte
Wenn Sie den One Tap-Client so konfiguriert haben, dass Google-Anmeldedaten abgerufen werden, kann Ihre App jetzt Google-ID-Tokens abrufen, die die Google-Konten Ihrer Nutzer darstellen. Informationen zur Verwendung dieser Tokens im Backend.
Wenn Sie die Anmeldung über Google unterstützen, können Sie mit dem One Tap-Client auch reibungslose Abläufe zur Kontoerstellung in Ihre App einfügen.