Neue Konten mit nur einem Tippen erstellen

Wenn Sie die Anmeldung mit Google-Konten unterstützen, können Sie den One Tap-Anmeldeclient verwenden, um Ihren Nutzern auch eine reibungslose Kontoerstellung zu ermöglichen, bei der sie Ihre App nicht verlassen müssen.

Benutzeroberfläche für die Registrierung mit nur einmal tippen

Wenn du die One Tap-Benutzeroberfläche anzeigst, werden Nutzer aufgefordert, mit einem der Google-Konten auf ihrem Gerät ein neues Konto für deine App zu erstellen. Wenn der Nutzer fortfährt, erhalten Sie ein ID-Token mit grundlegenden Profilinformationen – Name, Profilbild und bestätigte E‑Mail-Adresse –, mit denen Sie das neue Konto erstellen können.

Die Implementierung der Kontoerstellung mit One Tap besteht aus zwei Teilen:

  • Einbindung des One Tap-Clients in Ihre App, wie auf dieser Seite beschrieben. Dies entspricht im Wesentlichen der Anmeldung über One Tap, es gibt jedoch einige Unterschiede bei der Konfiguration.
  • Fügen Sie Ihrem Backend die Möglichkeit hinzu, Nutzerkonten aus Google-ID-Tokens zu erstellen. Dies wird unter ID-Tokens im Backend verwenden erläutert.

Wo sollte ich die Registrierung über One Tap verwenden?

Am wirkungsvollsten ist es, Nutzern die Registrierung über One Tap in einem Kontext anzubieten, in dem die Anmeldung neue Funktionen ermöglicht. Versuchen Sie zuerst, den Nutzer mit gespeicherten Anmeldedaten anzumelden. Wenn keine gespeicherten Anmeldedaten gefunden werden, biete dem Nutzer an, ein neues Konto zu erstellen.

Hinweis

Richten Sie Ihr Google Cloud Console-Projekt 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:

  • Anfragen für Passwort-Anmeldedaten nicht aktivieren. (Die One-Tap-Registrierung ist nur mit tokenbasierter Authentifizierung möglich.)
  • Aktivieren Sie Google-ID-Tokenanfragen mit setGoogleIdTokenRequestOptions() und diesen 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. One Tap-UI-Abbruch im Blick behalten

Sie sollten im Blick behalten, ob der Nutzer die One-Tap-Anmeldung bereits abgelehnt hat, indem er die Aufforderung geschlossen oder außerhalb der Aufforderung getippt hat. Sie können beispielsweise ein boolesches Attribut Ihrer Aktivität verwenden. (Siehe unten One Tap-Benutzeroberfläche nicht mehr anzeigen.)

3. Registrierung über One Tap-Oberfläche anzeigen

Wenn der Nutzer die Erstellung eines neuen Kontos mit One Tap nicht abgelehnt hat, rufe die Methode beginSignIn() des Clientobjekts auf und hänge Listener an das zurückgegebene Task an. Apps führen diesen Schritt normalerweise aus, wenn bei einer One Tap-Anmeldeanfrage keine gespeicherten Anmeldedaten gefunden werden, d. h. im Failure-Listener der Anmeldeanfrage:

  • Success-Listener: Der One Tap-Client ruft den Success-Listener auf, wenn der Nutzer ein oder mehrere Google-Konten auf dem Gerät eingerichtet hat. Rufe im Erfolgs-Listener den ausstehenden Intent aus dem Task-Ergebnis ab und übergib ihn an startIntentSenderForResult(), um die One Tap-Benutzeroberfläche zu starten.
  • Failure-Listener: Wenn der Nutzer keine Google-Konten auf dem Gerät hat, ruft der One Tap-Client den Failure-Listener auf. In diesem Fall sind keine Maßnahmen erforderlich: Präsentieren Sie weiterhin die abgemeldete Version der App. Der Nutzer kann sich über den 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 Aufforderung zur Registrierung über One Tap wird Ihrer App über die Methode onActivityResult() Ihrer Activity gemeldet. Wenn der Nutzer ein Konto erstellt hat, ist das Ergebnis ein Google-ID-Token. Wenn der Nutzer die Registrierung abgelehnt hat, indem er die One Tap-Benutzeroberfläche geschlossen oder außerhalb davon getippt hat, wird das Ergebnis mit dem Code RESULT_CANCELED zurückgegeben. Ihre App muss beide Möglichkeiten verarbeiten können.

Konto mit einem Google-ID-Token erstellen

Wenn der Nutzer sich mit einem Google-Konto registriert hat, kannst du ein ID-Token für den Nutzer abrufen, indem du die Intent-Daten von onActivityResult() an die Methode getSignInCredentialFromIntent() des One Tap-Clients übergibst. Die Anmeldedaten haben ein googleIdToken-Attribut, das nicht null ist.

Verwenden Sie das ID-Token, um ein Konto in Ihrem Backend zu erstellen (siehe Mit einem Backend über ID-Tokens authentifizieren) und den Nutzer anzumelden.

Der Berechtigungsnachweis enthält 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 beim 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 nicht mehr anzeigen, damit Sie Ihre Nutzer nicht mit wiederholten Aufforderungen verärgern. Im folgenden Beispiel wird dazu eine Property für die Aktivität festgelegt, mit der bestimmt wird, ob dem Nutzer die Anmeldung über One Tap angeboten werden soll. Sie können aber auch einen Wert in SharedPreferences speichern oder eine andere Methode verwenden.

Es ist wichtig, dass Sie eine eigene Ratenbegrenzung für Aufforderungen zur Anmeldung über One Tap implementieren. Wenn Sie das nicht tun und ein Nutzer mehrere Aufforderungen hintereinander abbricht, wird er vom One Tap-Client die nächsten 24 Stunden nicht mehr 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})")
                          }
                      }
                  }
              }
          }
      }
      // ...
  }

Nächste Schritte

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

Wenn du zusätzliche Informationen benötigst, um die Kontoerstellung abzuschließen, z. B. das Geburtsdatum des Nutzers, zeige dem Nutzer einen Ablauf für die Registrierungsdetails an, in dem du diese zusätzlichen Informationen anforderst. Sende sie dann an dein Backend, um die Kontoerstellung abzuschließen.