Neue Konten mit nur einem Tippen erstellen

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

Benutzeroberfläche für die Registrierung über One Tap

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

Die Implementierung der Kontoerstellung über One Tap umfasst zwei Teile:

  • Integration des One Tap-Clients in Ihre App, wie auf dieser Seite beschrieben. Das Verfahren ist größtenteils dasselbe wie bei 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. Das wird unter ID-Tokens im Backend verwenden beschrieben.

Wo sollte ich die Registrierung über One Tap verwenden?

Die Registrierung über One Tap ist am wirkungsvollsten, wenn die Anmeldung neue Funktionen ermöglicht. Versuchen Sie zuerst, den Nutzer mit gespeicherten Anmeldedaten anzumelden. Wenn keine gespeicherten Anmeldedaten gefunden werden, bieten Sie an, ein neues Konto für den Nutzer zu erstellen.

Hinweis

Richten Sie Ihr Google API Console-Projekt und Ihr Android-Projekt wie unter Mit der Anmeldung über One Tap beginnen beschrieben ein.

1. One Tap-Client konfigurieren

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

  • Aktivieren Sie keine Anfragen für Passwortanmeldedaten. Die Registrierung über One Tap ist nur mit der tokenbasierten Authentifizierung möglich.
  • Aktivieren Sie Google-ID-Token-Anfragen 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. Kündigung der One Tap-Benutzeroberfläche nachverfolgen

Sie sollten im Blick behalten, ob der Nutzer die Registrierung mit nur einem Fingertipp bereits abgelehnt hat, indem er die Aufforderung geschlossen oder außerhalb davon getippt hat. Das kann so einfach wie eine boolesche Property Ihrer Aktivität sein. One Tap-UI nicht mehr anzeigen

3. UI für die Registrierung über One Tap anzeigen

Wenn der Nutzer die Verwendung von One Tap zum Erstellen eines neuen Kontos nicht abgelehnt hat, rufen Sie die Methode beginSignIn() des Client-Objekts auf und hängen Sie Listener an das zurückgegebene Task an. Apps führen diesen Schritt in der Regel aus, wenn bei einer Anfrage zur Anmeldung über One Tap keine gespeicherten Anmeldedaten gefunden werden. Das heißt, im Fehler-Listener der Anmeldeanfrage.

Der One Tap-Client ruft den Erfolgslistener 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 Task-Ergebnis ab und übergeben Sie ihn an startIntentSenderForResult(), um die One Tap-Benutzeroberfläche 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 Aktion erforderlich. Sie können einfach die Ansicht der App für abgemeldete Nutzer weiter anzeigen und der Nutzer kann sich über Ihren normalen Vorgang 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 onActivityResult()-Methode 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 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, indem Sie die Intent-Daten von onActivityResult() an die Methode getSignInCredentialFromIntent() des One Tap-Clients übergeben. Die Anmeldedaten haben eine googleIdToken-Property, die nicht null ist.

Verwenden Sie das ID-Token, um ein Konto in Ihrem Backend zu erstellen (siehe Authentifizierung bei einem Backend mit ID-Tokens) und den Nutzer anzumelden.

Die Anmeldedaten enthalten auch alle zusätzlichen Details, die Sie angefordert haben, z. B. die bestätigte Telefonnummer des Kontos, sofern 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() eine ApiException mit dem Statuscode CommonStatusCodes.CANCELED ausgelöst. In diesem Fall sollten Sie die Benutzeroberfläche für die Anmeldung über One Tap vorübergehend nicht mehr anzeigen, damit Ihre Nutzer nicht durch wiederholte Aufforderungen genervt werden. Im folgenden Beispiel wird dies erreicht, indem eine Property für die Activity festgelegt wird, mit der bestimmt wird, ob dem Nutzer die Anmeldung über One Tap angeboten werden soll. 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 Anmeldeaufforderungen über One Tap implementieren. Wenn Sie das nicht tun und ein Nutzer mehrere Aufforderungen hintereinander abbricht, wird der Nutzer vom One Tap-Client in den 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 Profilbild-URL des Nutzers. Für viele Apps reichen diese Informationen aus, um den Nutzer im Backend zu authentifizieren und ein neues Konto zu erstellen.

Wenn Sie zusätzliche Informationen zum Erstellen des Kontos benötigen, z. B. das Geburtsdatum des Nutzers, präsentieren Sie dem Nutzer einen Ablauf für die Registrierungsdetails, in dem Sie diese zusätzlichen Informationen anfordern. Senden Sie sie dann an Ihr Backend, um die Kontoerstellung abzuschließen.