Nutzer mit ihren gespeicherten Anmeldedaten anmelden

Verwenden Sie den One Tap-Anmeldeclient, um die Berechtigung vom Nutzer zum Abrufen eines der Anmeldedaten anzufordern, 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 reibungslos 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, blenden Sie auf dem Anmeldebildschirm die One Tap-UI ein. 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 die Anmeldedaten angezeigt werden, die der Nutzer zuvor für die Anmeldung verwendet hat, kann sie Nutzer, die sich nur selten angemeldet haben, daran erinnern, wie sie sich beim letzten Mal angemeldet haben, und verhindern, dass sie versehentlich neue Konten mit Ihrer App erstellen.

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

Apps mit optionaler Anmeldung sollten aus den oben genannten Gründen auch die One Tap-Anmeldebildschirme auf den Anmeldebildschirmen 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 mit beiden anmelden. Die Unterstützung beider Funktionen wird empfohlen, damit neue Nutzer mit nur einem Tippen Konten erstellen können und so viele wiederkehrende Nutzer wie möglich die automatische oder einmalige Anmeldung verwenden können.

Wenn Ihre Anwendung die 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 zur Anmeldung bei Ihrer App aufgefordert, 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 so verhindert, dass Nutzer versehentlich neue Konten mit Ihrer App erstellen.

  • Wenn du Nutzer nach Möglichkeit automatisch anmelden möchtest, aktiviere 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 ein gespeichertes Passwort oder ein Google-Konto.
    • Der Nutzer hat die automatische Anmeldung nicht in den Google-Kontoeinstellungen 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 erhalten 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 angemeldeten Nutzern suchen

Wenn Ihre Aktivität von einem angemeldeten oder einem 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 aufrufen.

Sie sollten auch prüfen, ob der Nutzer die Anmeldung mit 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 mit One Tap anzeigen

Wenn der Nutzer nicht angemeldet ist und die Anmeldung über One Tap nicht bereits 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 Methode onCreate() 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-Benutzeroberfläche für die Anmeldung 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 weiter die Darstellung der Anwendung als abgemeldeter Nutzer anzeigen. Wenn du jedoch die One Tap-Registrierung unterstützt, kannst du 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 über die Methode onActivityResult() Ihrer Aktivität an Ihre App gesendet. Wenn sich der Nutzer anmeldet, sind das Ergebnis gespeicherte Anmeldedaten. Wenn der Nutzer sich abgelehnt hat, entweder durch Schließen der One Tap-UI oder durch Tippen 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 diese abrufen, indem Sie die Intent-Daten von onActivityResult() an die Methode getSignInCredentialFromIntent() des One Tap-Clients übergeben. Die Anmeldedaten haben ein googleIdToken-Attribut, das nicht null ist, wenn der Nutzer Anmeldedaten für ein Google-Konto 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 Anwendung.

  • Wenn ein Nutzername und ein Passwort abgerufen wurden, melden Sie sich damit auf die gleiche Weise an, wie Sie es vom Nutzer manuell machen würden.
  • Wenn Anmeldedaten des Google-Kontos 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 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 durch den Aufruf von getSignInCredentialFromIntent() ein ApiException mit dem Statuscode CommonStatusCodes.CANCELED ausgelöst. In diesem Fall sollten Sie die One Tap-Benutzeroberfläche für die Anmeldung vorübergehend deaktivieren, damit Sie Ihre Nutzer nicht durch wiederholte Aufforderungen verärgern. Im folgenden Beispiel wird eine Property für die Aktivität festgelegt, mit der 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, dass Sie Ihre eigene Ratenbegrenzung für Aufforderungen zur Anmeldung über One Tap implementieren. Wenn Sie dies 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

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 Services APIs zurückgesetzt wird, wenn sich Nutzer von Ihrer Anwendung abmelden.

Nächste Schritte

Wenn Sie den One Tap-Client zum Abrufen von Google-Anmeldedaten konfiguriert haben, kann Ihre App jetzt Google-ID-Tokens abrufen, die die Google-Konten Ihrer Nutzer repräsentieren. Hier erfahren Sie, wie Sie diese Tokens im Back-End verwenden.

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