Verwenden Sie den Client für die Anmeldung mit nur einem Tastenanschlag, um vom Nutzer die Berechtigung zum Abrufen einer der Anmeldedaten anzufordern, mit denen er sich zuvor in Ihrer App angemeldet hat. Diese Anmeldedaten können entweder ein Google-Konto oder eine Kombination aus Nutzername und Passwort sein, die er 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 nahtlos in Ihrer App anzumelden.
Wenn der Nutzer keine Anmeldedaten gespeichert hat, wird keine Benutzeroberfläche angezeigt und du kannst die normale Funktionsweise für nicht angemeldete Nutzer bereitstellen.
Wo sollte ich die Anmeldung über One Tap verwenden?
Wenn für Ihre App eine Anmeldung erforderlich ist, zeigen Sie die One Tap-Benutzeroberfläche auf dem Anmeldebildschirm an. Das kann auch dann hilfreich sein, wenn Sie bereits eine Schaltfläche „Über Google anmelden“ haben. Da die One Tap-Benutzeroberfläche so konfiguriert werden kann, dass nur Anmeldedaten angezeigt werden, die der Nutzer zuvor zur Anmeldung verwendet hat, kann sie Nutzer, die sich selten anmelden, daran erinnern, wie sie sich das letzte Mal angemeldet haben, und verhindern, dass sie versehentlich neue Konten in Ihrer App erstellen.
Wenn die Anmeldung für Ihre App optional ist, sollten Sie die Anmeldung mit nur einem Fingertipp auf allen Bildschirmen verwenden, die durch die Anmeldung verbessert werden. Wenn Nutzer beispielsweise in Ihrer App Inhalte ansehen können, während sie abgemeldet sind, aber erst nach der Anmeldung Kommentare posten oder Artikel in einen Einkaufswagen legen können, ist dies ein geeigneter Kontext für die Anmeldung mit nur einem Tastenanschlag.
Bei Apps, bei denen eine Anmeldung optional ist, sollte aus den oben genannten Gründen auch die Anmeldung per One Tap auf den Anmeldeseiten verwendet werden.
Hinweis
- Richten Sie Ihr Google API Console-Projekt und Ihr Android-Projekt wie unter Einführung in die Anmeldung mit nur einem Tastenanschlag beschrieben ein.
- Wenn Sie die passwortbasierte Anmeldung unterstützen, optimieren Sie Ihre App für die Autofill-Funktion oder verwenden Sie Smart Lock für Passwörter, damit Nutzer ihre Anmeldedaten nach der Anmeldung speichern können.
1. Client für die Anmeldung über One Tap konfigurieren
Sie können den One Tap-Anmeldeclient so konfigurieren, dass sich Nutzer mit gespeicherten Passwörtern, gespeicherten Google-Konten oder mit beiden anmelden können. Es wird empfohlen, beides zu unterstützen, um die Kontoerstellung mit nur einem Tippen für neue Nutzer und die automatische oder One-Tap-Anmeldung für so viele wiederkehrende Nutzer wie möglich zu ermöglichen.
Wenn Ihre App eine passwortbasierte Anmeldung verwendet, aktivieren Sie mit setPasswordRequestOptions()
Anfragen für Passwort-Anmeldedaten.
Wenn Sie in Ihrer App Google Log-in verwenden, können Sie mit setGoogleIdTokenRequestOptions()
Google ID-Token-Anfragen aktivieren und konfigurieren:
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 er nach autorisierten Konten filtert. Wenn Sie diese Option aktivieren, werden Nutzer vom One Tap-Client nur aufgefordert, sich mit Google-Konten in Ihrer App anzumelden, die sie bereits in der Vergangenheit verwendet haben. So können sich Nutzer leichter anmelden, wenn sie sich 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:- Der Nutzer hat genau eine Anmeldedaten für Ihre App gespeichert, also ein gespeichertes Passwort oder ein gespeichertes Google-Konto.
- Der Nutzer hat die automatische Anmeldung in den Google-Kontoeinstellungen nicht deaktiviert.
Die Verwendung eines Nonces ist optional. Wir empfehlen Ihnen jedoch dringend, einen Nonce zu verwenden, um die Sicherheit der Anmeldung zu verbessern und Replay-Angriffe zu vermeiden. Verwenden Sie setNonce, um in jede Anfrage eine Nonce aufzunehmen. 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. Nach einem angemeldeten Nutzer suchen
Wenn Ihre Aktivität von einem angemeldeten oder einem nicht angemeldeten Nutzer verwendet werden kann, prüfen Sie den Status des Nutzers, bevor Sie die Benutzeroberfläche für die Anmeldung mit nur einem Fingertipp anzeigen.
Sie sollten auch verfolgen, ob der Nutzer die Anmeldung mit nur einem Tastenanschlag 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 unter One-Tap-Benutzeroberfläche nicht mehr anzeigen.
3. Benutzeroberfläche für die Anmeldung über One Tap anzeigen
Wenn der Nutzer nicht angemeldet ist und die Anmeldung mit nur einem Tastendruck noch nicht abgelehnt hat, rufe die Methode beginSignIn()
des Clientobjekts auf und verknüpfe Listener mit dem zurückgegebenen Task
. In Apps geschieht dies in der Regel in der onCreate()
-Methode der Aktivität oder nach Bildschirmübergängen bei Verwendung einer Architektur mit einer einzelnen Aktivität.
Der One Tap-Client ruft den Erfolgs-Listener auf, wenn der Nutzer Anmeldedaten für Ihre App gespeichert hat. Rufen Sie im Erfolgs-Listener die ausstehende Absicht aus dem Task
-Ergebnis ab und übergeben Sie sie an startIntentSenderForResult()
, um die One Tap-Anmeldeoberfläche zu starten.
Wenn der Nutzer keine Anmeldedaten gespeichert hat, ruft der One Tap-Client den Fehlerlistener auf. In diesem Fall sind keine Maßnahmen erforderlich. Sie können einfach die App weiterhin für Nutzer anzeigen, die nicht angemeldet sind. Wenn Sie die Anmeldung mit nur einem Tipp unterstützen, können Sie diesen Ablauf hier starten, um die Kontoerstellung nahtlos zu gestalten. Weitere Informationen finden Sie unter Neue Konten mit nur einem Fingertipp 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 Aufforderung zur Anmeldung mit nur einem Fingertipp wird an Ihre App gesendet. Dazu wird die onActivityResult()
-Methode Ihrer Aktivität verwendet. Wenn sich der Nutzer angemeldet hat, werden die Anmeldedaten gespeichert. Wenn der Nutzer die Anmeldung 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.
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 getSignInCredentialFromIntent()
-Methode des One Tap-Clients übergeben. Die Anmeldedaten haben das Attribut googleIdToken
mit einem nicht nullwertigen Wert, wenn der Nutzer Anmeldedaten für ein Google-Konto für Ihre App freigegeben hat, oder das Attribut password
mit einem nicht nullwertigen Wert, wenn der Nutzer ein gespeichertes Passwort freigegeben hat.
Verwenden Sie die Anmeldedaten, um sich beim Backend Ihrer App zu authentifizieren.
- Wenn ein Nutzername und Passwort abgerufen wurden, melden Sie sich damit an, als hätten Sie sie manuell eingegeben.
Wenn Anmeldedaten für ein Google-Konto abgerufen wurden, verwenden Sie das ID-Token, um sich bei Ihrem Backend zu authentifizieren. Wenn Sie einen Nonce verwenden, um Replay-Angriffe zu vermeiden, prüfen Sie den Antwortwert auf Ihrem Backend-Server. Weitere Informationen finden Sie unter Mit ID-Tokens bei einem 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, 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 deaktivieren, damit Ihre Nutzer nicht durch wiederholte Aufforderungen gestört werden. Im folgenden Beispiel wird dazu eine Property für die Aktivität festgelegt, anhand derer ermittelt wird, ob dem Nutzer die Anmeldung mit nur einem Tastendruck angeboten werden soll. 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})") } } } } } } // ... }
5. Abmeldung verarbeiten
Wenn sich ein Nutzer von Ihrer App abmeldet, rufen Sie die Methode signOut()
des One Tap-Clients auf.
Wenn du signOut()
aufrufst, wird die automatische Anmeldung deaktiviert, bis sich der Nutzer wieder anmeldet.
Auch wenn Sie die automatische Anmeldung nicht verwenden, ist dieser Schritt wichtig, da so sichergestellt wird, dass der Authentifizierungsstatus aller von Ihnen verwendeten APIs für Google Play-Dienste zurückgesetzt wird, wenn sich Nutzer von Ihrer App abmelden.
Nächste Schritte
Wenn Sie den One Tap-Client so konfiguriert haben, dass Google-Anmeldedaten abgerufen werden, kann Ihre App jetzt Google-ID-Token abrufen, die die Google-Konten Ihrer Nutzer repräsentieren. Weitere Informationen zur Verwendung dieser Tokens im Backend
Wenn Sie Google Sign-in unterstützen, können Sie mit dem One Tap-Client Ihrer App einen reibungslosen Ablauf für die Kontoerstellung hinzufügen.