Crea nuovi account con un tocco

Se supporti l'accesso con gli Account Google, puoi utilizzare il client di accesso One Tap per offrire ai tuoi utenti anche un'esperienza di creazione degli account agevole che non li faccia mai fuori dal contesto della tua app.

UI per la registrazione con un tocco

Quando visualizzi l'UI di One Tap, agli utenti viene chiesto di creare un nuovo account con la tua app utilizzando uno degli Account Google sul loro dispositivo. Se l'utente sceglie di continuare, riceverai un token ID con le informazioni di base del profilo (il suo nome, la foto del profilo e l'indirizzo email verificato) che potrai utilizzare per creare il nuovo account.

L'implementazione della creazione di account One Tap si compone di due parti:

  • Integrazione del client One Tap nella tua app, descritta in questa pagina. È quasi uguale all'utilizzo dell'accesso One Tap, ma con alcune differenze di configurazione.
  • Aggiunta al backend della possibilità di creare account utente dai token ID Google, di cui si parlerà nell'articolo Utilizzare i token ID nel backend.

Dove devo utilizzare la registrazione One Tap?

La soluzione più efficace per offrire l'iscrizione One Tap agli utenti è un contesto in cui l'accesso consentirebbe l'attivazione di nuove funzionalità. Per prima cosa, cerca di far accedere l'utente con una credenziale salvata. Se non vengono trovate credenziali salvate, proponi di creare un nuovo account per l'utente.

Prima di iniziare

Configura il progetto nella console API di Google e il progetto Android come descritto in Iniziare a utilizzare l'accesso One Tap.

1. Configurare il client One Tap

Per configurare il client One Tap per la creazione di account:

  • Non attivare le richieste di credenziali per le password. La registrazione con un tocco è possibile solo con l'autenticazione basata su token.
  • Attiva le richieste di token ID Google utilizzando setGoogleIdTokenRequestOptions() e queste impostazioni:

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. Tieni traccia dell'annullamento dell'UI One Tap

Devi sapere se l'utente ha già rifiutato di utilizzare la registrazione One Tap chiudendo la richiesta o toccando all'esterno della richiesta. Può essere una proprietà booleana della tua Attività. Vedi Interrompere la visualizzazione dell'UI One Tap di seguito.

3. Visualizzare l'UI di registrazione One Tap

Se l'utente non ha rifiutato di utilizzare One Tap per creare un nuovo account, chiama il metodo beginSignIn() dell'oggetto client e collega i listener al Task che restituisce. In genere le app eseguono questo passaggio quando una richiesta di accesso One Tap non trova credenziali salvate, ovvero nel listener di errori della richiesta di accesso.

Il client One Tap chiamerà il listener se l'utente ha uno o più Account Google configurati sul dispositivo. Nel listener di errori, ottieni l'intent in sospeso dal risultato Task e trasmettilo a startIntentSenderForResult() per avviare l'UI One Tap.

Se l'utente non ha Account Google sul dispositivo, il client One Tap chiamerà il listener di errori. In questo caso, non è necessaria alcuna azione: puoi semplicemente continuare a presentare l'esperienza con l'app senza eseguire l'accesso e l'utente può registrarsi con il normale flusso di creazione dell'account.

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. Gestire la risposta dell'utente

La risposta dell'utente alla richiesta di registrazione One Tap verrà segnalata alla tua app utilizzando il metodo onActivityResult() dell'attività. Se l'utente ha scelto di creare un account, il risultato sarà un token ID Google. Se l'utente ha rifiutato di registrarsi, chiudendo l'interfaccia utente di One Tap o toccando all'esterno, il risultato verrà restituito con il codice RESULT_CANCELED. L'app deve gestire entrambe le possibilità.

Creare un account con un token ID Google

Se l'utente ha scelto di registrarsi con un Account Google, puoi ricevere un token ID passando i dati sull'intent da onActivityResult() al metodo getSignInCredentialFromIntent() del cliente One Tap. La credenziale avrà una proprietà googleIdToken diversa da null.

Utilizza il token ID per creare un account nel backend (vedi Autenticarsi con un backend utilizzando i token ID) e far accedere l'utente.

La credenziale contiene anche eventuali dettagli aggiuntivi che hai richiesto, come il numero di telefono verificato dell'account, se disponibile.

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

Interrompere la visualizzazione dell'UI One Tap

Se l'utente ha rifiutato di accedere, la chiamata al numero getSignInCredentialFromIntent() genera un ApiException con codice di stato CommonStatusCodes.CANCELED. In questo caso, dovresti interrompere temporaneamente la visualizzazione dell'interfaccia utente di accesso One Tap per evitare di infastidire gli utenti con richieste ripetute. L'esempio seguente risolve il problema impostando una proprietà nell'attività, che utilizza per determinare se offrire all'utente l'accesso One Tap; tuttavia, puoi anche salvare un valore su SharedPreferences o utilizzare un altro metodo.

È importante implementare una limitazione di frequenza personalizzata delle richieste di accesso One Tap. In caso contrario e se l'utente annulla diverse richieste di seguito, il client One Tap non chiederà all'utente di attendere per le 24 ore successive.

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

Passaggi successivi

Quando un utente completa la procedura di registrazione One Tap, ricevi un token ID Google, che include alcune informazioni di base del profilo: l'indirizzo email, il nome completo e l'URL dell'immagine del profilo dell'utente. Per molte app, queste informazioni sono sufficienti per autenticare l'utente nel backend e creare un nuovo account.

Se hai bisogno di informazioni aggiuntive per completare la creazione dell'account, ad esempio la data di nascita dell'utente, presenta all'utente un flusso con i dettagli di registrazione, in cui richiedi queste informazioni aggiuntive, quindi inviale al backend per completare la creazione dell'account.