Nutzer mit gespeicherten Anmeldedaten anmelden

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Verwenden Sie den One Tap-Anmeldeclient, um vom Nutzer die Berechtigung zum Abrufen einer zuvor bei Ihrer App verwendeten Anmeldedaten anzufordern. Bei diesen Anmeldedaten kann es sich entweder um ein Google-Konto oder eine Kombination aus Nutzername und Passwort handeln, die er über Google Chrome, die Android-Funktion „Automatisches Ausfüllen“ oder Smart Lock für Passwörter gespeichert hat.

Anmeldung über die Benutzeroberfläche

Nachdem die Anmeldedaten abgerufen wurden, können Sie den Nutzer problemlos bei Ihrer Anwendung anmelden.

Wenn der Nutzer keine Anmeldedaten gespeichert hat, wird keine UI angezeigt und Sie können die normale Anmeldung verwenden.

Wo sollte ich mich über One Tap anmelden?

Wenn Nutzer sich in deiner App anmelden müssen, zeige die One Tap-UI auf dem Anmeldebildschirm an. Das kann nützlich sein, auch wenn Sie bereits die Schaltfläche „Über Google anmelden“ haben: Da die Benutzeroberfläche von One Tap so konfiguriert werden kann, dass nur Anmeldedaten angezeigt werden, die der Nutzer zuvor verwendet hat, können Nutzer daran erinnert werden, dass sie sich selten anmelden müssen, wenn sie sich das letzte 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 One Tap-Anmeldung auf jedem Bildschirm verwenden, auf dem die Anmeldung durch eine Anmeldung optimiert wird. Wenn Nutzer beispielsweise mit deiner App Inhalte durchsuchen können, während sie abgemeldet sind, aber nach der Anmeldung nur Kommentare posten oder Artikel in den Einkaufswagen legen können, ist dies für die Anmeldung über One Tap sinnvoll.

Optionale Apps für die Anmeldung sollten aus den oben genannten Gründen auch auf ihren Anmeldebildschirmen die One Tap-Anmeldung verwenden.

Hinweis

1. One Tap-Anmeldeclient konfigurieren

Sie können den One Tap-Anmeldeclient so konfigurieren, dass Nutzer mit gespeicherten Passwörtern, gespeicherten Google-Konten oder beidem angemeldet werden. Es wird empfohlen, beide Arten zu unterstützen, um das Erstellen von Konten mit nur einem Tippen für neue Nutzer und die automatische Anmeldung oder die Anmeldung mit nur einem Tippen für so viele wiederkehrende Nutzer wie möglich zu ermöglichen.

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

Wenn deine App Google Log-in verwendet, verwende setGoogleIdTokenRequestOptions(), um Google-ID-Tokenanfragen zu aktivieren und zu 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 die Android-Client-ID.

  • Konfigurieren Sie den Client so, dass nach autorisierten Konten gefiltert wird. Wenn Sie diese Option aktivieren, fordert der One Tap-Client Nutzer nur dazu auf, sich mit Google-Konten in Ihrer App anzumelden, die sie in der Vergangenheit bereits verwendet haben. So können sich Nutzer einfacher anmelden, wenn sie nicht sicher sind, ob sie bereits ein Konto haben oder welches Google-Konto sie verwendet haben. Außerdem verhindern Sie so, dass Nutzer versehentlich neue Konten mit Ihrer App erstellen.

  • Wenn du Nutzer nach Möglichkeit automatisch anmelden möchtest, aktiviere die Funktion mit setAutoSelectEnabled(). Die automatische Anmeldung ist möglich, wenn die folgenden Kriterien erfüllt sind:

    • Der Nutzer hat genau ein Anmeldedaten für Ihre App, also ein gespeichertes Passwort oder ein gespeichertes Google-Konto.
    • Der Nutzer hat die automatische Anmeldung in den Google-Kontoeinstellungen nicht deaktiviert.
  • Wir empfehlen, eine Nonce zu verwenden, um die Sicherheit der Anmeldung zu verbessern und Wiederholungsangriffe zu vermeiden. Verwenden Sie setNonce, um in jeder Anfrage eine Nonce einzufügen. Tipps und zusätzliche Informationen zum Generieren einer Nonce finden Sie im Abschnitt Notce 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 deine Aktivität von einem angemeldeten oder von einem nicht angemeldeten Nutzer verwendet werden kann, solltest du den Status des Nutzers prüfen, bevor die UI für die Anmeldung über One Tap angezeigt wird.

Du solltest auch im Auge behalten, ob der Nutzer die Anmeldung über One Tap bereits abgelehnt hat. Schließe dazu die Aufforderung oder tippe außerhalb der Seite. Das kann ein einfaches boolesches Attribut deiner Aktivität sein. Weitere Informationen finden Sie unten im Abschnitt Die Benutzeroberfläche von One Tap nicht mehr anzeigen.

3. Benutzeroberfläche für die Anmeldung über One Tap anzeigen

Wenn der Nutzer nicht angemeldet ist und die Verwendung der One Tap-Anmeldung noch nicht abgelehnt hat, rufen Sie die Methode beginSignIn() des Clientobjekts auf und hängen Sie Listener an die zurückgegebene Task an. In der Regel tun dies in der Activity-Methode onCreate() oder nach Bildschirmübergängen, wenn eine Single-Activity-Architektur verwendet wird.

Der One Tap-Client ruft den Erfolgs-Listener auf, wenn der Nutzer gespeicherte Anmeldedaten für Ihre App hat. Rufen Sie im Erfolgs-Listener den ausstehenden Intent aus dem Ergebnis Task 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 musst du nichts unternehmen. Du kannst einfach weiter die App ohne Anmeldung präsentieren. Wenn du die Registrierung über One Tap unterstützt, kannst du diesen Vorgang jedoch hier starten, um eine nahtlose Kontoerstellung zu ermöglichen. Weitere Informationen finden Sie unter Mit einem Tippen neue Konten 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 in One Tap wird über die Aktivitätsmethode onActivityResult() an Ihre App gemeldet. Wenn sich der Nutzer anmeldet, werden gespeicherte Anmeldedaten angezeigt. Wenn der Nutzer sich weigert, sich anzumelden, entweder durch Schließen der One Tap-UI oder durch Tippen auf eine Außenseite, wird das Ergebnis mit dem Code RESULT_CANCELED zurückgegeben. Deine App muss beide Möglichkeiten erfüllen.

Mit abgerufenen Anmeldedaten anmelden

Wenn der Nutzer Anmeldedaten mit deiner App teilt, kannst du sie abrufen, indem du die Intent-Daten von onActivityResult() an die Methode getSignInCredentialFromIntent() des One Tap-Clients übergibst. Die Anmeldedaten haben eine googleIdToken-Property, die nicht null ist, wenn der Nutzer die Anmeldedaten für ein Google-Konto mit deiner App geteilt hat, oder eine password-Property, die nicht null ist, wenn der Nutzer ein gespeichertes Passwort geteilt hat.

Verwenden Sie die Anmeldedaten, um sich beim Back-End Ihrer App zu authentifizieren.

  • Wenn ein Nutzername und ein Passwortpaar abgerufen wurden, verwenden Sie diese zur Anmeldung auf dieselbe Weise wie bei einer manuellen Eingabe durch den Nutzer.
  • 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 eine Nonce verwenden, um Angriffe zu vermeiden, prüfen Sie 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) {
                    // ...
                }
            }
        }
    }
    // ...
}

Benutzeroberfläche von One Tap 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-Anmelde-UI vorübergehend deaktivieren, damit Ihre Nutzer nicht durch wiederholte Aufforderungen gestört werden. Im folgenden Beispiel wird dies durch Festlegen einer Property für die Aktivität erreicht, 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 die Anmeldung über One Tap implementieren. Wenn du mehrere Aufforderungen nacheinander abbricht, wird der Nutzer vom One Tap-Client in den nächsten 24 Stunden nicht dazu 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. Umgang mit Abmeldung

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 sich der Nutzer wieder anmeldet.

Auch wenn Sie die automatische Anmeldung nicht verwenden, ist dieser Schritt wichtig, da dadurch sichergestellt wird, dass der Authentifizierungsstatus aller von Ihnen verwendeten Play Services APIs zurückgesetzt wird, wenn Nutzer sich von Ihrer App 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 Ihre Google-Konten repräsentieren. Hier erfahren Sie, wie Sie diese Tokens im Back-End verwenden können.

Wenn du Google Log-in unterstützt, kannst du auch mit dem One Tap-Client reibungslose Kontoerstellungsabläufe in deine App einbinden.