Verwenden Sie den One Tap-Anmeldeclient, um vom Nutzer die Berechtigung zum Abrufen der Datei anzufordern eines der Anmeldedaten, die sie zuvor für die Anmeldung in Ihrer App verwendet haben. Diese Anmeldedaten können entweder ein Google-Konto oder eine Kombination aus Nutzername und Passwort sein. die sie bei Google gespeichert haben, mit Chrome, Android Autofill oder Smart Lock für Passwörter.
Nachdem Anmeldedaten erfolgreich abgerufen wurden, können Sie sie für einen reibungslosen Ablauf verwenden. melden Sie den Nutzer in Ihrer App an.
Wenn der Nutzer keine Anmeldedaten gespeichert hat, wird keine UI angezeigt und Sie können wie gewohnt ohne Anmeldung.
Wo sollte ich die One Tap-Anmeldung verwenden?
Wenn Nutzer sich in deiner App anmelden müssen, zeige bei der Anmeldung die One Tap-Benutzeroberfläche an Bildschirm. Das kann selbst dann hilfreich sein, wenn Sie bereits ein „Über Google anmelden“ Schaltfläche: Da die One Tap-Benutzeroberfläche so konfiguriert werden kann, dass nur Anmeldedaten angezeigt werden, Nutzer bereits verwendet haben, kann dies als Erinnerung für Nutzer dienen, die sich selten sich beim letzten Mal angemeldet haben, um zu verhindern, neue Konten mit deiner App zu erstellen.
Wenn die Anmeldung für Ihre App optional ist, können Sie die Anmeldung über One Tap auf allen Bildschirm, der durch die Anmeldung verbessert werden kann. Wenn Nutzende beispielsweise Inhalte mit deiner App ansehen, während du abgemeldet bist, kann aber nur Kommentare posten oder Artikel in den Einkaufswagen legen möchten, wäre dies ein sinnvoller Kontext für Anmeldung über One Tap.
In optionalen Apps sollte auch die One Tap-Anmeldung auf dem Anmeldebildschirm verwendet werden. aus den oben genannten Gründen.
Hinweis
- Richten Sie Ihr Projekt in der Google APIs-Konsole und Ihr Android-Projekt wie unter Erste Schritte mit der One Tap-Anmeldung
- Wenn Sie die passwortbasierte Anmeldung unterstützen, optimieren Sie Ihre App für Autofill (oder Smart Lock für Passwörter verwenden), damit Nutzer ihre Passwörter nach der Anmeldung ein Passwort.
1. One Tap-Anmeldeclient konfigurieren
Sie können den One Tap-Anmeldeclient so konfigurieren, dass Nutzer sich mit gespeicherten Passwörter, gespeicherte Google-Konten oder beides. (Es wird empfohlen, beide zu verwenden, Aktivieren der Kontoerstellung durch einmaliges Tippen für neue Nutzer und die automatische Anmeldung oder die Anmeldung durch einmaliges Tippen für möglichst viele wiederkehrende Nutzende.
Wenn Ihre App eine passwortbasierte Anmeldung verwendet, verwenden Sie setPasswordRequestOptions()
, um
Anfragen für Passwortanmeldedaten aktivieren
Wenn deine App Google Log-in verwendet, verwende setGoogleIdTokenRequestOptions()
, um
Google-ID-Tokenanfragen aktivieren und konfigurieren:
Legen Sie als Server-Client-ID die ID fest, die Sie in den Google APIs erstellt haben. Konsolen aus. Dies ist die Client-ID deines Servers, Ihre Android-Client-ID.
Konfigurieren Sie den Client so, dass nach autorisierten Konten gefiltert wird. Wenn Sie diese Option aktivieren, werden Nutzer vom One Tap-Client nur dazu aufgefordert, sich mit Google-Konten, die sie in der Vergangenheit bereits verwendet haben. Dies kann Nutzenden helfen, wenn sie nicht sicher sind, ob sie bereits ein Konto haben Google-Konto, das er verwendet hat, und verhindert, dass Nutzer versehentlich neue erstellen mit deiner App verknüpft sind.
Wenn Sie Nutzer nach Möglichkeit automatisch anmelden möchten, aktivieren Sie die Funktion mit
setAutoSelectEnabled()
. Die automatische Anmeldung ist möglich, wenn das erfüllt sind:- Der Nutzer hat genau ein Ausweisdokument für Ihre Anwendung gespeichert. Das heißt, ein gespeichertes Passwort oder ein gespeichertes Google-Konto.
- Der Nutzer hat die automatische Anmeldung in seinem Google-Kontoeinstellungen:
Obwohl dies optional ist, empfehlen wir Ihnen dringend, eine Nonce zu verwenden, die Anmeldesicherheit verbessern und Replay-Angriffe verhindern. Verwenden Sie setNonce um in jede Anfrage eine Nonce aufzunehmen. Weitere Informationen zu SafetyNet Nonce erhalten finden Sie Vorschläge und zusätzliche 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
Prüfen Sie, ob Ihre Aktivitäten von einem angemeldeten oder nicht angemeldeten Nutzer verwendet werden können. bevor die One Tap-Anmeldebenutzeroberfläche angezeigt wird.
Sie sollten auch im Auge behalten, ob der Nutzer die Nutzung Mit One Tap kannst du dich anmelden, indem du die Aufforderung schließt oder außerhalb der Aufforderung tippst. Dies kann einfach eine boolesche Eigenschaft deiner Activity sein. Weitere Informationen finden Sie unten im Abschnitt One Tap-Benutzeroberfläche nicht mehr anzeigen.
3. One Tap-Anmelde-UI aufrufen
Wenn der Nutzer nicht angemeldet ist und die One Tap-Anmeldung nicht bereits abgelehnt hat:
die beginSignIn()
-Methode des Clientobjekts aufrufen und Listener an den
Task
zurückgegeben wird. Apps führen das normalerweise über die onCreate()
-Methode der Aktivität aus
oder nach Bildschirmübergängen,
wenn eine Architektur mit einer einzigen Aktivität verwendet wird.
Der One Tap-Client ruft den Erfolgs-Listener auf, wenn der Nutzer gespeicherte
Anmeldedaten für Ihre App. Rufen Sie im Erfolgs-Listener den ausstehenden Intent von
das Ergebnis Task
und übergeben es an startIntentSenderForResult()
, um den
Benutzeroberfläche für die Anmeldung über One Tap
Wenn der Nutzer keine gespeicherten Anmeldedaten hat, ruft der One Tap-Client die Failure-Listener. In diesem Fall sind keine Maßnahmen erforderlich. Sie können einfach fortfahren. Darstellung der App, in der Nutzer abgemeldet sind. Wenn Sie jedoch One Tap Registrierung kannst du hier mit dem Ablauf beginnen, um eine nahtlose Kontoerstellung zu ermöglichen. Nutzererfahrung. Weitere Informationen finden Sie unter Neue Konten mit nur einmal tippen 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. Die Antwort des Nutzers verarbeiten
Die Antwort des Nutzers auf die Aufforderung zur Anmeldung über One Tap wird an Ihre App gemeldet
mithilfe der onActivityResult()
-Methode deiner Aktivität. Wenn der Nutzer sich angemeldet hat,
ist das Ergebnis ein gespeichertes Ausweisdokument. Wenn der Nutzer die Anmeldung abgelehnt hat,
indem Sie die One Tap-Benutzeroberfläche schließen oder außerhalb davon tippen, wird das Ergebnis mit den
Code RESULT_CANCELED
. Ihre App muss beide Möglichkeiten unterstützen.
Mit abgerufenen Anmeldedaten anmelden
Wenn der Nutzer die Anmeldedaten für Ihre App freigegeben hat, können Sie sie folgendermaßen abrufen:
die Intent-Daten von onActivityResult()
an den
getSignInCredentialFromIntent()
-Methode. Der Berechtigungsnachweis hat einen Wert ungleich null.
Property googleIdToken
, wenn der Nutzer die Anmeldedaten eines Google-Kontos freigegeben hat für
deine App oder eine password
-Property ungleich null, wenn der Nutzer ein gespeichertes Passwort geteilt hat.
Verwenden Sie die Anmeldedaten zur Authentifizierung beim Back-End Ihrer Anwendung.
- Wenn ein Nutzername und ein Passwort abgerufen wurden, verwenden Sie diese, um sich anzumelden wie bei einer manuellen Eingabe.
Wenn die Anmeldedaten für das Google-Konto abgerufen wurden, verwenden Sie das ID-Token zur Authentifizierung mit Ihrem Back-End. Wenn Sie sich für die Verwendung einer Nonce entschieden haben, um Wiederholungen zu vermeiden prüfen Angriffe den Antwortwert auf Ihrem Back-End-Server. Weitere Informationen finden Sie unter Mit einem Back-End mithilfe von ID-Tokens 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 getSignInCredentialFromIntent()
angerufen
gibt ApiException
mit dem Statuscode CommonStatusCodes.CANCELED
aus.
In diesem Fall sollten Sie die One Tap-Anmeldebenutzeroberfläche vorübergehend deaktivieren, damit Sie
nicht durch wiederholte Aufforderungen
genervt werden. Mit dem folgenden Beispiel können
indem Sie eine Eigenschaft für die Aktivität festlegen, mit der bestimmt wird,
dem Nutzer eine One Tap-Anmeldung anzubieten; Sie können aber auch einen Wert
SharedPreferences
oder eine andere Methode verwenden.
Es ist wichtig, dass Sie Ihre eigene Ratenbegrenzung für Aufforderungen zur Anmeldung über One Tap implementieren. Wenn das nicht der Fall ist und ein Nutzer mehrere Aufforderungen hintereinander abbricht, wird der One Tap-Client den Nutzer in den nächsten 24 Stunden nicht mehr auffordert.
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 handhaben
Wenn sich ein Nutzer von Ihrer App abmeldet, rufen Sie die Methode signOut()
des One Tap-Clients auf.
Wenn Sie signOut()
aufrufen, wird die automatische Anmeldung deaktiviert, bis der Nutzer sich wieder anmeldet.
Auch wenn Sie nicht die automatische Anmeldung verwenden, ist dieser Schritt wichtig, sorgt dafür, dass der Authentifizierungsstatus aller Auch die von dir verwendeten Play-Dienste-APIs werden zurückgesetzt.
Nächste Schritte
Wenn Sie den One Tap-Client so konfiguriert haben, dass Google-Anmeldedaten abgerufen werden, wird Ihre App können jetzt Google-ID-Tokens abrufen, die die Google-Konten. Weitere Informationen wie Sie diese Tokens auf dem Back-End verwenden können.
Wenn Sie Google Log-in unterstützen, können Sie auch den One Tap-Client verwenden, um reibungslosen Ablauf der Kontoerstellung in Ihrer App.