Neue Konten mit nur einem Tippen erstellen

Wenn Sie die Anmeldung über Google-Konten unterstützen, können Sie mit dem One Tap-Anmeldeclient Ihren Nutzern auch eine reibungslose Kontoerstellung ermöglichen, ohne dass sie den Kontext Ihrer App verlassen müssen.

Benutzeroberfläche für die Registrierung mit 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 in Ihrer App zu erstellen. Wenn der Nutzer fortfahren möchte, erhalten Sie ein ID-Token mit grundlegenden Profilinformationen wie Name, Profilbild und bestätigter E-Mail-Adresse, mit dem Sie das neue Konto erstellen können.

Die Implementierung der Kontoerstellung über One Tap besteht aus zwei Teilen:

  • Integrieren Sie den One Tap-Client in Ihre App. Wie das geht, wird auf dieser Seite beschrieben. Das funktioniert im Wesentlichen genauso wie bei der Anmeldung mit nur einem Tastenanschlag, es gibt jedoch einige Unterschiede bei der Konfiguration.
  • Fügen Sie Ihrem Backend die Möglichkeit hinzu, Nutzerkonten aus Google-ID-Tokens zu erstellen. Weitere Informationen finden Sie unter ID-Tokens im Backend verwenden.

Wo sollte ich die Registrierung über One Tap verwenden?

Die Registrierung per One Tap ist am effektivsten, wenn Nutzer durch die Anmeldung neue Funktionen nutzen können. 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 API Console-Projekt und Ihr Android-Projekt wie unter Einrichtung der Anmeldung mit nur einem Tastenanschlag beschrieben ein.

1. One Tap-Client konfigurieren

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

  • Aktivieren Sie keine Anfragen für Passwort-Anmeldedaten. Die Registrierung per One Tap ist nur mit tokenbasierter Authentifizierung möglich.
  • Aktiviere Google-ID-Token-Anfragen 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. Kündigung der One Tap-Benutzeroberfläche verfolgen

Sie sollten verfolgen, ob der Nutzer die Anmeldung mit One Tap bereits abgelehnt hat, indem er entweder die Aufforderung schließt oder außerhalb davon tippt. Das kann so einfach wie eine boolesche Property Ihrer Aktivität sein. Weitere Informationen finden Sie unten im Abschnitt Einrichtungsoberfläche für die Einrichtung per Schnelltippen nicht mehr anzeigen.

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

Wenn der Nutzer die Verwendung von One Tap zum Erstellen eines neuen Kontos nicht abgelehnt hat, rufe die Methode beginSignIn() des Clientobjekts auf und binde Listener an die zurückgegebene Task an. Apps führen diesen Schritt in der Regel aus, wenn bei einer Anmeldung mit nur einem Tastendruck keine gespeicherten Anmeldedaten gefunden werden. Das geschieht im Fehlerempfänger der Anmeldeanfrage.

Der One Tap-Client ruft den Erfolgs-Listener auf, wenn der Nutzer mindestens ein Google-Konto auf dem Gerät eingerichtet hat. Rufen Sie im Erfolgs-Listener die ausstehende Intent aus dem Task-Ergebnis ab und übergeben Sie sie 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 Fehlerlistener auf. In diesem Fall sind keine Maßnahmen erforderlich: Sie können die App einfach weiterhin für Nutzer anzeigen, die nicht angemeldet sind, 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 Aufforderung zur Anmeldung mit nur einem Fingertipp wird an Ihre App gesendet. Dazu wird die onActivityResult()-Methode Ihrer Aktivität verwendet. 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 berücksichtigen.

Konto mit einem Google-ID-Token erstellen

Wenn sich der Nutzer 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 getSignInCredentialFromIntent()-Methode des One Tap-Clients weitergibst. Die Anmeldedaten haben eine nicht nullwertige googleIdToken-Eigenschaft.

Verwende das ID-Token, um ein Konto in deinem Backend zu erstellen (siehe Mit ID-Tokens bei einem Backend authentifizieren) und den Nutzer anzumelden.

Die Anmeldedaten enthalten auch alle von Ihnen angeforderten zusätzlichen Details, 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 ausgegeben. In diesem Fall sollten Sie die Benutzeroberfläche für die Anmeldung mit nur einem Fingerabdruck vorübergehend nicht mehr anzeigen, damit Nutzer nicht durch wiederholte Aufforderungen genervt werden. Im folgenden Beispiel wird dazu eine Property für die Aktivität festgelegt, anhand derer entschieden wird, ob dem Nutzer die Anmeldung mit nur einem Tastenanschlag angeboten wird. Sie können aber auch einen Wert in SharedPreferences speichern oder eine andere Methode verwenden.

Sie müssen Ihre eigenen Ratenbeschränkungen für Aufforderungen zur Anmeldung über One Tap implementieren. Wenn Sie dies nicht tun und ein Nutzer mehrere Aufforderungen hintereinander abbricht, wird er 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 Anmeldung mit One Tap durchläuft, erhalten Sie ein Google-ID-Token mit einigen grundlegenden Profilinformationen: der E-Mail-Adresse, dem vollständigen Namen und der 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 Sie für die Kontoerstellung zusätzliche Informationen benötigen, z. B. das Geburtsdatum des Nutzers, müssen Sie ihm einen Registrierungsvorgang mit den entsprechenden Feldern anzeigen. Senden Sie diese Informationen dann an Ihr Backend, um die Kontoerstellung abzuschließen.