Nutzer mit ihren gespeicherten Anmeldedaten anmelden

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.

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

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

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.