Neue Konten mit nur einem Tippen erstellen

Wenn Sie die Anmeldung mit Google-Konten unterstützen, können Sie den One Tap-Log-in-Client verwenden, um Ihren Nutzern eine reibungslose Kontoerstellung zu ermöglichen, ohne dass sie den Kontext Ihrer App verlieren.

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

Wenn die One Tap-Benutzeroberfläche angezeigt wird, werden Nutzer aufgefordert, mit einem der Google-Konten auf ihrem Gerät ein neues Konto bei Ihrer App zu erstellen. Wenn der Nutzer fortfahren möchte, erhalten Sie ein ID-Token mit grundlegenden Profilinformationen (Name, Profilbild und bestätigter E-Mail-Adresse), mit denen Sie das neue Konto erstellen können.

Die Implementierung eines One Tap-Kontos erfolgt in zwei Teile:

  • Die auf dieser Seite beschriebene Integration des One Tap-Clients in Ihre App Dies entspricht größtenteils der Anmeldung über One Tap, allerdings mit einigen Unterschieden bei der Konfiguration.
  • Zusätzliche Möglichkeit zum Erstellen von Nutzerkonten aus Google-ID-Tokens im Back-End, was unter ID-Tokens im Back-End verwenden erläutert wird.

Wo sollte ich mich über One Tap registrieren?

Am wirkungsvollsten ist es, Nutzern die One Tap-Registrierung anzubieten, wenn durch die Anmeldung neue Funktionen aktiviert werden. Versuchen Sie zuerst, den Nutzer mit gespeicherten Anmeldedaten anzumelden. Wenn keine gespeicherten Anmeldedaten gefunden werden, biete an, ein neues Konto für den Nutzer zu erstellen.

Hinweis

Richten Sie Ihr Google APIs-Konsolenprojekt und Ihr Android-Projekt wie unter Erste Schritte mit der Anmeldung über One Tap beschrieben ein.

1. One Tap-Client konfigurieren

So konfigurieren Sie den One Tap-Client für die Kontoerstellung:

  • Aktivieren Sie keine Anfragen für Anmeldedaten für Passwörter. Die Registrierung mit nur einem Tippen ist nur mit einer tokenisierten Authentifizierung möglich.
  • Aktivieren Sie Google-ID-Tokenanfragen mit setGoogleIdTokenRequestOptions() und den folgenden Einstellungen:

Java

public class YourActivity extends AppCompatActivity {

  // ...

  private SignInClient oneTapClient;
  private BeginSignInRequest signUpRequest;

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState,
                       @Nullable PersistableBundle persistentState) {
      super.onCreate(savedInstanceState, persistentState);

      oneTapClient = Identity.getSignInClient(this);
      signUpRequest = BeginSignInRequest.builder()
              .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder()
                      .setSupported(true)
                      // Your server's client ID, not your Android client ID.
                      .setServerClientId(getString(R.string.your_web_client_id))
                      // Show all accounts on the device.
                      .setFilterByAuthorizedAccounts(false)
                      .build())
              .build();

      // ...
  }
}

Kotlin

class YourActivity : AppCompatActivity() {
    // ...

    private lateinit var oneTapClient: SignInClient
    private lateinit var signUpRequest: BeginSignInRequest

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        oneTapClient = Identity.getSignInClient(this)
        signUpRequest = BeginSignInRequest.builder()
            .setGoogleIdTokenRequestOptions(
                BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                    .setSupported(true)
                    // Your server's client ID, not your Android client ID.
                    .setServerClientId(getString(R.string.your_web_client_id))
                    // Show all accounts on the device.
                    .setFilterByAuthorizedAccounts(false)
                    .build())
            .build()
        // ...
    }
    // ...
}

2. Stornierung der One Tap-UI im Blick behalten

Sie sollten prüfen, ob der Nutzer die Registrierung über One Tap bereits abgelehnt hat, indem Sie entweder die Aufforderung schließen oder außerhalb davon tippen. Dies kann so einfach sein wie eine boolesche Eigenschaft Ihrer Aktivität. Weitere Informationen finden Sie weiter unten im Abschnitt One Tap-Benutzeroberfläche nicht mehr anzeigen.

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

Wenn der Nutzer nicht abgelehnt hat, One Tap zum Erstellen eines neuen Kontos zu verwenden, rufen Sie die Methode beginSignIn() des Clientobjekts auf und hängen Sie Listener an die zurückgegebene Task an. Apps führen diesen Schritt in der Regel aus, wenn bei einer One Tap-Anmeldeanfrage keine gespeicherten Anmeldedaten gefunden werden, also im Fehler-Listener der Anmeldeanfrage.

Der One Tap-Client ruft den Erfolgs-Listener auf, wenn der Nutzer ein oder mehrere Google-Konten auf dem Gerät eingerichtet hat. Rufen Sie im Erfolgs-Listener den ausstehenden Intent aus dem Ergebnis Task ab und übergeben Sie ihn an startIntentSenderForResult(), um die One Tap-UI zu starten.

Wenn der Nutzer keine Google-Konten auf dem Gerät hat, ruft der One Tap-Client den Fehler-Listener auf. In diesem Fall ist keine Maßnahme erforderlich: Sie können einfach weiterhin die App ohne Anmeldung präsentieren und der Nutzer kann sich mit dem normalen Ablauf zur Kontoerstellung registrieren.

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 Google Accounts found. Just continue presenting the signed-out UI.
                Log.d(TAG, e.getLocalizedMessage());
            }
        });

Kotlin

oneTapClient.beginSignIn(signUpRequest)
    .addOnSuccessListener(this) { result ->
        try {
            startIntentSenderForResult(
                result.pendingIntent.intentSender, REQ_ONE_TAP,
                null, 0, 0, 0)
        } catch (e: IntentSender.SendIntentException) {
            Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
        }
    }
    .addOnFailureListener(this) { e ->
        // No Google Accounts found. Just continue presenting the signed-out UI.
        Log.d(TAG, e.localizedMessage)
    }

4. Antwort des Nutzers verarbeiten

Die Antwort des Nutzers auf die Registrierungsaufforderung bei One Tap wird mithilfe der Methode onActivityResult() Ihrer Aktivität an Ihre App gemeldet. Wenn der Nutzer ein Konto erstellt, ist das Ergebnis ein Google-ID-Token. Wenn der Nutzer sich nicht registriert 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.

Konto mit einem Google-ID-Token erstellen

Wenn sich der Nutzer mit einem Google-Konto registriert hat, können Sie ein ID-Token für den Nutzer abrufen. Dazu übergeben Sie die Intent-Daten von onActivityResult() an die Methode getSignInCredentialFromIntent() des One Tap-Clients. Die Anmeldedaten haben das Attribut googleIdToken ungleich null.

Erstellen Sie mit dem ID-Token ein Konto in Ihrem Back-End (siehe Mit einem Back-End mithilfe von ID-Tokens authentifizieren) und melden Sie den Nutzer an.

Die Anmeldedaten enthalten auch alle zusätzlichen Details, die Sie angefordert haben, z. B. die bestätigte Telefonnummer des Kontos, falls verfügbar.

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();
                  if (idToken !=  null) {
                      // Got an ID token from Google. Use it to authenticate
                      // with your backend.
                      Log.d(TAG, "Got ID token.");
                  }
              } 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
                    when {
                        idToken != null -> {
                            // Got an ID token from Google. Use it to authenticate
                            // with your backend.
                            Log.d(TAG, "Got ID token.")
                        }
                        else -> {
                            // Shouldn't happen.
                            Log.d(TAG, "No ID token!")
                        }
                    }
                } 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 durch wiederholte Aufforderungen verärgern. Im folgenden Beispiel wird dafür eine Property für die Aktivität festgelegt, anhand derer bestimmt wird, ob dem Nutzer die Anmeldung über One Tap angeboten wird. Sie können aber 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})")
                        }
                    }
                }
            }
        }
    }
    // ...
}

Nächste Schritte

Wenn ein Nutzer die Registrierung über One Tap abgeschlossen hat, erhalten Sie ein Google-ID-Token, das einige grundlegende Profilinformationen enthält: die E-Mail-Adresse, den vollständigen Namen und die Profilbild-URL des Nutzers. Bei vielen Anwendungen reichen diese Informationen aus, um den Nutzer im Back-End zu authentifizieren und ein neues Konto zu erstellen.

Wenn Sie zusätzliche Informationen benötigen, um die Kontoerstellung abzuschließen, z. B. das Geburtsdatum des Nutzers, müssen Sie dem Nutzer einen Vorgang mit Registrierungsdetails präsentieren. Senden Sie die Informationen dann an Ihr Back-End, um die Kontoerstellung abzuschließen.