Se supporti l'accesso con gli Account Google, puoi utilizzare il client di accesso con un solo tocco per offrire ai tuoi utenti anche un'esperienza di creazione dell'account senza problemi che non li rimuove mai dal contesto della tua app.
Quando viene visualizzata l'interfaccia utente 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 (nome, foto del profilo e indirizzo email verificato), che potrai utilizzare per creare il nuovo account.
L'implementazione della creazione dell'account One Tap è composta da due parti:
- Integrazione del client One Tap nella tua app, descritta in questa pagina. L'operazione è in gran parte la stessa dell'accesso One Tap, ma con alcune differenze nella configurazione.
- Aggiungere al tuo backend la possibilità di creare account utente dai token ID Google, come descritto in Utilizzare i token ID sul backend.
Dove devo utilizzare la registrazione One Tap?
Il luogo più efficace per offrire la registrazione One Tap agli utenti è in un contesto in cui l'accesso attiverebbe nuove funzionalità. Innanzitutto, prova ad accedere con una credenza salvata. Se non vengono trovate credenziali salvate, offri di creare un nuovo account per l'utente.
Prima di iniziare
Configura il progetto della console API di Google e il progetto Android come descritto in Iniziare a utilizzare Accedi con un tocco.
1. Configurare il client One Tap
Per configurare il client One Tap per la creazione dell'account:
- Non attivare le richieste di credenziali per le password. La registrazione One Tap è possibile solo con l'autenticazione basata su token.
Attiva le richieste di token ID Google utilizzando
setGoogleIdTokenRequestOptions()
e queste impostazioni:- Imposta l'ID client del server sull'ID che hai creato nella console API di Google. Tieni presente che si tratta dell'ID client del server, non del tuo ID client Android.
- Configura il client in modo che mostri tutti gli Account Google sul dispositivo, ovvero non filtrare in base agli account autorizzati.
- Se vuoi, puoi anche richiedere il numero di telefono verificato per l'account.
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. Monitorare l'annullamento dell'interfaccia utente One Tap
Devi tenere traccia di se l'utente ha già rifiutato di utilizzare la registrazione con un solo tocco chiudendo la richiesta o toccando al di fuori. Può essere semplice come una proprietà booleana della tua attività. (vedi Interrompere la visualizzazione dell'interfaccia utente con un tocco di seguito).
3. Visualizza l'interfaccia utente della 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 associa gli ascoltatori al Task
che viene restituito. In genere le app eseguono questo passaggio quando una richiesta di accesso con un solo tocco non trova alcuna credenziale salvata, ovvero nell'ascoltatore di errori della richiesta di accesso.
Il client One Tap chiamerà l'ascoltatore di eventi di successo se l'utente ha configurato uno o più Account Google sul dispositivo. Nell'ascoltatore di eventi di successo, recupera l'intent in attesa dal risultato Task
e passalo a startIntentSenderForResult()
per avviare l'interfaccia utente One Tap.
Se l'utente non ha Account Google sul dispositivo, il client One Tap chiama l'ascoltatore di errori. In questo caso, non è necessaria alcuna azione: puoi semplicemente continuare a presentare l'esperienza di accesso dell'app 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()
della tua 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 One Tap o toccando al di fuori, 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 ottenere un token ID per l'utente passando i dati dell'intent da onActivityResult()
al metodo getSignInCredentialFromIntent()
del client One Tap. La credenziale avrà una proprietà googleIdToken
non null.
Utilizza il token ID per creare un account nel tuo backend (vedi Autenticarsi con un backend utilizzando i token ID) e fai accedere l'utente.
La credenziale contiene anche eventuali dettagli aggiuntivi che hai richiesto, ad esempio 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'interfaccia utente di One Tap
Se l'utente ha rifiutato di accedere, la chiamata a getSignInCredentialFromIntent()
lancerà un ApiException
con un codice di stato CommonStatusCodes.CANCELED
.
In questo caso, dovresti interrompere temporaneamente la visualizzazione dell'interfaccia utente di accesso con un solo tocco per non infastidire gli utenti con richieste ripetute. L'esempio seguente lo ottiene impostando una proprietà su Attività, che viene utilizzata per determinare se offrire all'utente l'accesso con un solo tocco. Tuttavia, puoi anche salvare un valore in SharedPreferences
o utilizzare un altro metodo.
È importante implementare il proprio limite di frequenza delle richieste di accesso One Tap. In caso contrario, se un utente annulla più richieste di seguito, il client One Tap non lo chiederà 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 il flusso 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 sul 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 di dettagli di registrazione in cui richiedi queste informazioni aggiuntive. Poi, inviale al tuo backend per completare la creazione dell'account.