Twórz nowe konta jednym kliknięciem

Jeśli obsługujesz logowanie się za pomocą kont Google, możesz korzystać z logowania jednym dotknięciem. który umożliwi użytkownikom bezproblemowe tworzenie kont nigdy nie wyjmują ich z kontekstu aplikacji.

Interfejs rejestracji jednym dotknięciem

Gdy wyświetlisz interfejs One Tap, użytkownicy zobaczą prośbę o utworzenie nowego konta za pomocą jednego z kont Google na urządzeniu. Jeśli użytkownik wybierze aby kontynuować, otrzymasz token tożsamości z podstawowymi informacjami imię i nazwisko, zdjęcie profilowe oraz zweryfikowany adres e-mail – których możesz użyć, utworzyć nowe konto.

Proces tworzenia konta jednym dotknięciem składa się z 2 etapów:

  • Zintegrowanie klienta One Tap z aplikacją, co zostało opisane na tej stronie. Zasadniczo działa to tak samo jak logowanie jednym dotknięciem, ale występują pewne różnice konfiguracji.
  • Dodanie do backendu możliwości tworzenia kont użytkowników na podstawie identyfikatora Google Zostało to omówione w artykule Używanie tokenów tożsamości w backendzie.

Gdzie mam korzystać z rejestracji jednym dotknięciem?

Najlepszym miejscem, w którym warto zaoferować użytkownikom rejestrację jednym dotknięciem, jest kontekst, zalogowanie się spowoduje włączenie nowych funkcji. Najpierw spróbuj zalogować użytkownika za pomocą zapisane dane logowania. Jeśli nie można znaleźć zapisanych danych logowania, zaproponuj utworzenie nowych dla użytkownika.

Zanim zaczniesz

Skonfiguruj projekt konsoli interfejsów API Google i projekt na Androida zgodnie z opisem w artykule Pierwsze kroki z logowaniem jednym dotknięciem.

1. Konfigurowanie klienta One Tap

Aby skonfigurować klienta jednym dotknięciem na potrzeby tworzenia konta, wykonaj te czynności:

  • Nie włączaj żądań danych logowania. (Rejestracja jednym dotknięciem jest możliwa tylko uwierzytelnianie oparte na tokenach).
  • Włącz żądania tokenów identyfikatora Google za pomocą metod setGoogleIdTokenRequestOptions() i następujące ustawienia:

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. Śledzenie anulowania interfejsu jednym dotknięciem

Sprawdzaj, czy użytkownik odmówił już korzystania z jednego dotknięcia się zarejestrować, zamykając prompt lub dotykając go poza nim. Może to być jako właściwość logiczną aktywności. (Patrz: Wyłączanie wyświetlania przycisku jednym dotknięciem) UI).

3. Wyświetl interfejs rejestracji jednym dotknięciem

Jeśli użytkownik nie odmówił utworzenia nowego konta jednym dotknięciem, wywołaj metodę metody beginSignIn() obiektu klienta i dołącz detektory do Task „powrót karetki”. Aplikacje zazwyczaj wykonują ten krok, gdy prośba o zalogowanie się jednym dotknięciem nie znajduje wszystkich zapisanych danych logowania – czyli w detektorze błędów logowania. użytkownika.

Klient One Tap zadzwoni do detektora sukcesu, jeśli użytkownik ma co najmniej jedną konta Google skonfigurowane na urządzeniu; W detektorze sukcesu znajdź oczekujące intencję z wyniku Task i przekazać ją do startIntentSenderForResult() do uruchomić interfejs jednym dotknięciem.

Jeśli użytkownik nie ma na urządzeniu żadnych kont Google, klient One Tap wywoła detektor błędów. W takim przypadku nie musisz nic robić: możesz po prostu kontynuować prezentację aplikacji po wylogowaniu się, a użytkownik może zarejestrować się w normalny sposób.

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. Obsługa odpowiedzi użytkownika

Odpowiedź użytkownika na prośbę o rejestrację jednym dotknięciem zostanie zgłoszona do aplikacji za pomocą metody onActivityResult() aktywności. Jeśli użytkownik utworzy konta, wynikiem działania będzie token identyfikatora Google. Jeśli użytkownik odmówił rejestracji, przez zamknięcie interfejsu jednym dotknięciem lub dotknięcie obszaru poza nim, z kodem RESULT_CANCELED. Aplikacja musi obsługiwać obie możliwości.

Utwórz konto za pomocą tokena identyfikatora Google

Jeśli użytkownik zarejestrował się za pomocą konta Google, możesz uzyskać token tożsamości użytkownika, przekazując dane o zamiarach z aplikacji onActivityResult() do usługi jednym dotknięciem metody getSignInCredentialFromIntent() klienta. Dokument będzie mieć niepusta właściwość googleIdToken.

Użyj tokena identyfikatora, aby utworzyć konto w backendzie (zobacz Uwierzytelniaj za pomocą za pomocą tokenów tożsamości) i zaloguj się.

Dane logowania zawierają też wszelkie dodatkowe informacje, o które prosisz, takie jak zweryfikowanego numeru telefonu konta (jeśli jest dostępny).

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) {
                    // ...
            }
        }
    }
    // ...
}

Przestań wyświetlać interfejs jednym dotknięciem

Jeśli użytkownik odmówił zalogowania, połączenie z numerem getSignInCredentialFromIntent() zwróci żądanie ApiException z kodem stanu CommonStatusCodes.CANCELED. W takim przypadku należy tymczasowo zatrzymać wyświetlanie interfejsu logowania jednym dotknięciem aby nie irytować użytkowników wielokrotnymi prośbami. Przykład poniżej Aby to zrobić, ustaw w aktywności właściwość, która służy do określać, czy oferować użytkownikowi logowanie jednym dotknięciem; ale możesz też zapisz wartość w funkcji SharedPreferences lub użyj innej metody.

Ważne jest wdrożenie własnego ograniczenia liczby żądań logowania jednym dotknięciem. Jeśli tego nie zrobisz, a użytkownik anuluje kilka promptów z rzędu, nie wyświetla komunikatu przez następne 24 godziny.

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})")
                        }
                    }
                }
            }
        }
    }
    // ...
}

Dalsze kroki

Gdy użytkownik zakończy rejestrację jednym dotknięciem, otrzymasz token identyfikatora Google, zawiera podstawowe informacje profilowe: adres e-mail, imię i nazwisko użytkownika, i adres URL zdjęcia profilowego. W przypadku wielu aplikacji te informacje wystarczą, uwierzytelnić użytkownika w backendzie i utworzyć nowe konto.

Jeśli do utworzenia konta potrzebujesz dodatkowych informacji, na przykład datę urodzenia użytkownika – podaj szczegóły rejestracji, gdzie: o dodatkowe informacje. Następnie wyślij je do backendu, aby dokończyć tworzenie konta.