Warnung: Diese Daten werden gemäß der Google-Benutzerdatenrichtlinie bereitgestellt. Bitte überprüfen Sie die Richtlinien und halten Sie sie ein. Andernfalls kann das Projekt oder das Konto gesperrt werden.

Melden Sie Benutzer mit ihren gespeicherten Zugangsdaten an

Verwenden Sie den One-Tap-Anmelde-Client, um die Erlaubnis des Benutzers anzufordern, eine der Anmeldeinformationen abzurufen, die er zuvor für die Anmeldung bei Ihrer App verwendet hat. Diese Anmeldeinformationen können entweder ein Google-Konto oder eine Kombination aus Benutzername und Passwort sein, die sie mit Chrome, Android Autofill oder Smart Lock for Passwords bei Google gespeichert haben.

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

Wenn die Anmeldeinformationen erfolgreich abgerufen wurden, können Sie sie verwenden, um den Benutzer reibungslos bei Ihrer App anzumelden.

Wenn der Benutzer keine Anmeldeinformationen gespeichert hat, wird keine Benutzeroberfläche angezeigt und Sie können Ihre normale Abmeldeerfahrung bereitstellen.

Wo sollte ich die One-Tap-Anmeldung verwenden?

Wenn Ihre App erfordert, dass sich Benutzer anmelden, zeigen Sie die One Tap-Benutzeroberfläche auf Ihrem Anmeldebildschirm an. Dies kann auch dann hilfreich sein, wenn Sie bereits über eine Schaltfläche "Mit Google anmelden" verfügen: Da die One Tap-Benutzeroberfläche so konfiguriert werden kann, dass nur die Anmeldeinformationen angezeigt werden, die der Benutzer zuvor für die Anmeldung verwendet hat, kann dies eine Erinnerung für Benutzer sein, die sich selten anmelden wie sie sich beim letzten Mal angemeldet haben, und verhindern Sie, dass sie versehentlich neue Konten mit Ihrer App erstellen.

Wenn die Anmeldung für Ihre App optional ist, sollten Sie die One-Tap-Anmeldung auf jedem Bildschirm in Betracht ziehen, der durch die Anmeldung eine verbesserte Benutzererfahrung bietet. Wenn Benutzer beispielsweise Inhalte mit Ihrer App durchsuchen können, während sie abgemeldet sind, aber nur Kommentare posten können oder Hinzufügen von Artikeln zu einem Warenkorb nach der Anmeldung, dies wäre ein sinnvoller Kontext für die One Tap-Anmeldung.

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

Bevor Sie beginnen

1. Konfigurieren Sie den One Tap-Anmeldeclient

Sie können den One Tap-Anmeldeclient so konfigurieren, dass sich Benutzer mit gespeicherten Passwörtern, gespeicherten Google-Konten oder beidem anmelden. (Es wird empfohlen, beide zu unterstützen, um die Kontoerstellung mit einem Fingertipp für neue Benutzer und die automatische oder One-Tap-Anmeldung für so viele wiederkehrende Benutzer wie möglich zu ermöglichen.)

Wenn Ihre App verwendet kennwortbasierte Anmeldung, Verwendung setPasswordRequestOptions() Passwort Berechtigungsnachweis - Anfragen zu ermöglichen.

Wenn Ihre App benutzt Google Sign-in, verwenden setGoogleIdTokenRequestOptions() zu aktivieren und zu konfigurieren Google ID - Token Anfragen:

  • Stellen Sie die Server - Client - ID auf die ID Sie in der Google APIs - Konsole erstellt . Beachten Sie, dass dies die Client-ID Ihres Servers ist, nicht Ihre Android-Client-ID.

  • Konfigurieren Sie den Client, um nach autorisierten Konten zu filtern. Wenn Sie diese Option aktivieren, fordert der One Tap-Client die Benutzer nur auf, sich bei Ihrer App mit Google-Konten anzumelden, die sie bereits in der Vergangenheit verwendet haben. Dies kann Nutzern helfen, sich erfolgreich anzumelden, wenn sie nicht sicher sind, ob sie bereits ein Konto haben oder welches Google-Konto sie verwendet haben, und verhindert, dass Nutzer versehentlich neue Konten mit Ihrer App erstellen.

  • Wenn Sie Benutzer anmelden automatisch möchten , wenn möglich, aktivieren Sie die Funktion mit setAutoSelectEnabled() . Eine automatische Anmeldung ist möglich, wenn die folgenden Kriterien erfüllt sind:

    • Der Benutzer hat genau eine Anmeldeinformation für Ihre App gespeichert. Das heißt, ein gespeichertes Passwort oder ein gespeichertes Google-Konto.
    • Der Benutzer hat nicht die automatische Anmeldung in ihren deaktiviert Google - Kontoeinstellungen .
  • Obwohl optional, empfehlen wir Ihnen dringend, eine Nonce zu verwenden, um die Anmeldesicherheit zu verbessern und Replay-Angriffe zu vermeiden. Verwenden Sie setNonce eine Nonce in jeder Anforderung aufzunehmen. SafetyNet sehen ist eine Nonce erhält für Anregungen und weiteren Detailabschnitt eine Nonce auf der Generierung.

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. Suchen Sie nach einem angemeldeten Benutzer

Wenn Ihre Aktivität von einem angemeldeten Benutzer oder einem abgemeldeten Benutzer verwendet werden könnte, überprüfen Sie den Status des Benutzers, bevor Sie die One Tap-Anmeldebenutzeroberfläche anzeigen.

Sie sollten auch verfolgen, ob der Benutzer die One-Tap-Anmeldung bereits abgelehnt hat, indem Sie entweder die Eingabeaufforderung schließen oder außerhalb tippen. Dies kann so einfach wie eine boolesche Eigenschaft Ihrer Aktivität sein. (Siehe Stopp , um die One Tap UI angezeigt wird , weiter unten.)

3. Zeigen Sie die One Tap-Anmeldebenutzeroberfläche an

Wenn der Benutzer nicht angemeldet ist und hat es abgelehnt , nicht bereits ein Tap - Sign-in, rufen Sie das Client - Objekt verwenden beginSignIn() Methode, und befestigen Hörer auf die Task er zurückkehrt. Apps tut dies in der Regel in der Aktivität für onCreate() Methode oder nach den Bildschirmübergängen , wenn eine Single-Activity - Architektur.

Der One Tap-Client ruft den Erfolgs-Listener auf, wenn der Benutzer über gespeicherte Anmeldeinformationen für Ihre App verfügt. Im Erfolg Zuhörer, erhalten die anstehende Absicht aus dem Task - Ergebnis und übergibt es an startIntentSenderForResult() die One Tap - Sign-in - Benutzeroberfläche zu starten.

Wenn der Benutzer keine gespeicherten Anmeldeinformationen hat, ruft der One Tap-Client den Fehler-Listener auf. In diesem Fall ist keine Aktion erforderlich: Sie können einfach weiterhin die abgemeldete Erfahrung der App präsentieren. Wenn Sie jedoch die One Tap-Anmeldung unterstützen, können Sie diesen Ablauf hier für eine nahtlose Kontoerstellung starten. Siehe neue Konten erstellen mit einem Hahn .

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. Behandeln Sie die Antwort des Benutzers

Die Reaktion der Benutzer auf die One Tap-Anmeldeaufforderung wird zu Ihrer App zu melden Ihre Aktivität der mit onActivityResult() Methode. Wenn sich der Benutzer für die Anmeldung entschieden hat, werden als Ergebnis gespeicherte Anmeldeinformationen angezeigt. Wenn der Benutzer sich anmelden abgelehnt, entweder durch die One Tap UI Schließen oder außerhalb tippen, kehrt das Ergebnis mit dem Code RESULT_CANCELED . Ihre App muss beide Möglichkeiten beherrschen.

Melden Sie sich mit den abgerufenen Zugangsdaten an

Wenn der Benutzer zu teilen Anmeldeinformationen mit Ihrer Anwendung gewählt haben, können Sie sie abrufen , indem Sie die Absicht Daten aus vorbei onActivityResult() zu dem einen Tap Kunden getSignInCredentialFromIntent() Methode. Der Berechtigungsnachweis wird eine Nicht-Null - googleIdToken Eigenschaft , wenn der Benutzer eine Google - Konto - Anmeldeinformationen mit Ihrer App geteilt oder eine Nicht-Null - password - Eigenschaft , wenn der Benutzer ein gespeichertes Passwort geteilt.

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

  • Wenn ein Benutzername-Passwort-Paar abgerufen wurde, verwenden Sie diese zum Anmelden auf die gleiche Weise, als ob der Benutzer 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 entschieden haben, um Replay-Angriffe zu vermeiden, überprüfen Sie den Antwortwert auf Ihrem Back-End-Server. Siehe Authentifizieren mit einem Backend - ID - Token .

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) {
                    // ...
                }
            }
        }
    }
    // ...
}

Beenden Sie die Anzeige der One-Tap-Benutzeroberfläche

Wenn der Benutzer den Anruf an anmelden abgelehnt, getSignInCredentialFromIntent() wird einen Wurf ApiException mit einem CommonStatusCodes.CANCELED Statuscode. In diesem Fall sollten Sie die One Tap-Anmelde-UI vorübergehend deaktivieren, damit Sie Ihre Benutzer nicht mit wiederholten Aufforderungen ärgern. Im folgenden Beispiel wird dies erreicht, indem eine Eigenschaft für die Aktivität festgelegt wird, die verwendet wird, um zu bestimmen, ob dem Benutzer die One-Tap-Anmeldung angeboten wird. aber Sie könnten auch einen Wert speichern SharedPreferences oder eine andere Methode verwenden.

Es ist wichtig, dass Sie Ihre eigene Ratenbegrenzung für One Tap-Anmeldeaufforderungen implementieren. Wenn Sie dies nicht tun und ein Benutzer mehrere Aufforderungen hintereinander abbricht, wird der One Tap-Client den Benutzer in den nächsten 24 Stunden nicht auffordern.

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 bearbeiten

Wenn sich ein Nutzer aus der App, rufen Sie die One Tap Client signOut() Methode. Der Aufruf signOut() deaktiviert die automatische Anmeldung in bis sich der Benutzer wieder an .

Auch wenn Sie die automatische Anmeldung nicht verwenden, ist dieser Schritt wichtig, da dadurch sichergestellt wird, dass der Authentifizierungsstatus aller von Ihnen verwendeten Play-Dienst-APIs zurückgesetzt wird, wenn sich Benutzer von Ihrer App abmelden.

Nächste Schritte

Wenn Sie den One Tap-Client zum Abrufen von Google-Anmeldeinformationen konfiguriert haben, kann Ihre App jetzt Google-ID-Token abrufen, die die Google-Konten Ihrer Nutzer darstellen. Erfahren Sie, wie Sie können diese Token auf dem Backend verwenden .

Wenn Sie Google Sign-in unterstützt, können Sie auch den One Tap - Client verwenden , um reibungsKontoErstellung App fließt zu Ihrem hinzufügen .