Nutzer mit ihren gespeicherten Anmeldedaten anmelden

Verwenden Sie den One Tap-Anmeldeclient, um die Berechtigung vom Nutzer anzufordern, eines der Anmeldedaten abzurufen, die er zuvor für die Anmeldung in Ihrer App verwendet hat. Diese Anmeldedaten können entweder ein Google-Konto oder eine Kombination aus Nutzername und Passwort sein, die der Nutzer über Chrome, Android Autofill oder Smart Lock für Passwörter bei Google gespeichert hat.

Benutzeroberfläche für die Anmeldung mit nur einem Tippen

Wenn Anmeldedaten erfolgreich abgerufen wurden, können Sie sie verwenden, um den Nutzer ganz einfach bei Ihrer Anwendung anzumelden.

Wenn der Nutzer keine Anmeldedaten gespeichert hat, wird keine Benutzeroberfläche angezeigt und Sie können die normale Abmeldung verwenden.

Wo sollte ich mich über One Tap anmelden?

Wenn Nutzer sich in Ihrer App anmelden müssen, zeigen Sie die One Tap-Benutzeroberfläche auf dem Anmeldebildschirm an. Das kann auch dann hilfreich sein, wenn Sie bereits die 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 für die Anmeldung verwendet hat, kann sie Nutzer, die sich nur selten angemeldet haben, daran erinnern und verhindern, dass sie versehentlich neue Konten mit Ihrer App erstellen.

Wenn die Anmeldung für Ihre App optional ist, können Sie die Anmeldung über One Tap auf jedem Bildschirm verwenden, bei dem eine Anmeldung möglich ist. Wenn Nutzer beispielsweise ohne Anmeldung Inhalte mit deiner App durchsuchen, aber erst nach der Anmeldung Kommentare posten oder Artikel in den Einkaufswagen legen können, wäre das ein sinnvoller Kontext für die Anmeldung über One Tap.

Apps mit optionaler Anmeldung sollten aus den oben genannten Gründen auch auf den Anmeldebildschirmen die Anmeldung über One Tap verwenden.

Hinweis

1. One Tap-Client für die Anmeldung konfigurieren

Sie können den One Tap-Anmeldeclient so konfigurieren, dass Nutzer sich mit gespeicherten Passwörtern, gespeicherten Google-Konten oder beidem anmelden. Es wird empfohlen, beide Optionen zu unterstützen, damit neue Nutzer mit einmaligem Tippen ein Konto erstellen können und für möglichst viele wiederkehrende Nutzer die automatische Anmeldung oder Anmeldung mit nur einem Tippen.

Wenn Ihre Anwendung eine passwortbasierte Anmeldung verwendet, verwenden Sie setPasswordRequestOptions(), um Anfragen für Anmeldedaten für Passwörter zu aktivieren.

Wenn deine Anwendung Google Log-in verwendet, kannst du mit setGoogleIdTokenRequestOptions() Google-ID-Tokenanfragen aktivieren und konfigurieren:

  • Legen Sie die Server-Client-ID auf die ID fest, die Sie in der Google APIs-Konsole erstellt haben. Dies ist die Client-ID Ihres Servers, nicht 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 mit Google-Konten aufgefordert, sich bei Ihrer App anzumelden, die sie bereits in der Vergangenheit verwendet haben. So können sich Nutzer leichter 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 mit Ihrer App erstellen.

  • Wenn Nutzer automatisch angemeldet werden sollen, aktivieren Sie das Feature mit setAutoSelectEnabled(). Die automatische Anmeldung ist möglich, wenn die folgenden Kriterien erfüllt sind:

    • Der Nutzer hat für Ihre Anwendung genau ein Ausweisdokument gespeichert, also entweder ein gespeichertes Passwort oder ein gespeichertes Google-Konto.
    • Der Nutzer hat die automatische Anmeldung in seinen Google-Kontoeinstellungen nicht deaktiviert.
  • Wir empfehlen dringend, eine Nonce zu verwenden, um die Anmeldesicherheit zu verbessern und Replay-Angriffe zu vermeiden. Fügen Sie mit setNonce in jede Anfrage eine Nonce ein. Vorschläge und weitere Informationen zum Generieren einer Nonce finden Sie im Abschnitt Nonce abrufen von SafetyNet.

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 nicht angemeldeten Nutzer verwendet werden könnte, prüfen Sie den Status des Nutzers, bevor Sie die One Tap-Benutzeroberfläche für die Anmeldung anzeigen.

Sie sollten auch prüfen, ob der Nutzer die Anmeldung über One Tap bereits abgelehnt hat, indem Sie entweder die Aufforderung schließen oder außerhalb davon tippen. Dies kann einfach eine boolesche Eigenschaft Ihrer Aktivität sein. Weitere Informationen finden Sie unten im Abschnitt 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 über One Tap nicht abgelehnt hat, rufen Sie die Methode beginSignIn() des Clientobjekts auf und hängen Sie Listener an die zurückgegebene Task an. Apps tun dies normalerweise in der onCreate()-Methode der Aktivität oder nach Bildschirmübergängen, wenn eine Architektur mit einer Aktivität verwendet wird.

Der One Tap-Client ruft den Erfolgs-Listener auf, wenn der Nutzer Anmeldedaten für Ihre App gespeichert hat. Rufen Sie im Erfolgs-Listener den ausstehenden Intent aus dem Task-Ergebnis ab und übergeben Sie ihn an startIntentSenderForResult(), um die One Tap-Anmelde-UI zu starten.

Wenn der Nutzer keine gespeicherten Anmeldedaten hat, ruft der One Tap-Client den Fehler-Listener auf. In diesem Fall sind keine Maßnahmen erforderlich. Sie können einfach weiterhin die Darstellung der App ohne Anmeldung anzeigen. Wenn Sie jedoch die Registrierung über One Tap unterstützen, können Sie diesen Vorgang hier starten, um eine nahtlose Kontoerstellung zu ermöglichen. 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. Antwort des Nutzers verarbeiten

Die Antwort des Nutzers auf die Aufforderung zur Anmeldung über One Tap wird mithilfe der Methode onActivityResult() Ihrer Aktivität an Ihre App gemeldet. Wenn der Nutzer sich anmeldet, werden Anmeldedaten gespeichert. Wenn der Nutzer sich abgelehnt hat, entweder durch Schließen der One Tap-UI oder durch Tippen auf eine Stelle außerhalb, wird das Ergebnis mit dem Code RESULT_CANCELED zurückgegeben. Ihre App muss mit beiden Möglichkeiten umgehen können.

Mit abgerufenen Anmeldedaten anmelden

Wenn der Nutzer Anmeldedaten mit Ihrer App teilt, können Sie sie abrufen, indem Sie die Intent-Daten von onActivityResult() an die Methode getSignInCredentialFromIntent() des One Tap-Clients übergeben. Die Anmeldedaten haben eine googleIdToken-Property ungleich null, wenn der Nutzer die Anmeldedaten eines Google-Kontos mit Ihrer Anwendung geteilt hat, oder eine password-Property, die nicht null ist, wenn der Nutzer ein gespeichertes Passwort geteilt hat.

Verwenden Sie die Anmeldedaten zur Authentifizierung beim Back-End Ihrer App.

  • Wenn ein Nutzername und ein Passwort abgerufen wurden, verwenden Sie sie zur Anmeldung auf die gleiche Weise, wie Sie es tun würden, wenn der Nutzer sie manuell eingegeben hätte.
  • Wenn die Anmeldedaten für das Google-Konto abgerufen wurden, verwenden Sie das ID-Token, um sich bei Ihrem Back-End zu authentifizieren. Wenn Sie sich für die Verwendung einer Nonce zur Vermeidung von Wiederholungsangriffen entschieden haben, prüfen Sie den Antwortwert auf Ihrem Back-End-Server. Weitere Informationen finden Sie unter Mit ID-Tokens bei einem Back-End 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 durch den Aufruf von getSignInCredentialFromIntent() ein ApiException mit dem Statuscode CommonStatusCodes.CANCELED ausgegeben. In diesem Fall sollten Sie die Benutzeroberfläche für die Anmeldung über One Tap vorübergehend deaktivieren, damit Sie Ihre Nutzer nicht mit wiederholten Aufforderungen verärgern. Im folgenden Beispiel wird dafür ein Attribut für die Aktivität festgelegt, mit dem bestimmt wird, ob dem Nutzer die Anmeldung über One Tap angeboten wird. Sie können jedoch auch einen Wert in SharedPreferences speichern oder eine andere Methode verwenden.

Es ist wichtig, eine eigene Ratenbegrenzung für Anmeldeaufforderungen über One Tap zu implementieren. Wenn Sie das nicht tun und ein Nutzer mehrere Aufforderungen hintereinander abbricht, fordert der One Tap-Client den Nutzer in den nächsten 24 Stunden nicht auf.

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 das Aufrufen 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, weil dadurch sichergestellt wird, dass der Authentifizierungsstatus aller von Ihnen verwendeten Play-Dienste-APIs zurückgesetzt wird, wenn sich Nutzer von Ihrer App abmelden.

Nächste Schritte

Wenn Sie den One Tap-Client zum Abrufen von Google-Anmeldedaten konfiguriert haben, kann Ihre Anwendung jetzt Google-ID-Tokens abrufen, die die Google-Konten Ihrer Nutzer repräsentieren. Informationen zur Verwendung dieser Tokens im Back-End

Wenn Sie Google Log-in unterstützen, können Sie auch den One Tap-Client verwenden, um Ihrer App eine reibungslose Kontoerstellung hinzuzufügen.