Créez des comptes d'un simple geste

Si vous pouvez vous connecter avec des comptes Google, vous pouvez utiliser le service de connexion One Tap pour offrir à vos utilisateurs une expérience de création de compte ne les sorte jamais du contexte de votre application.

UI d'inscription en un seul geste

Lorsque vous affichez l'interface utilisateur de One Tap, les utilisateurs sont invités à créer un compte avec votre application à l'aide de l'un des comptes Google sur son appareil. Si l'utilisateur choisit vous obtenez un jeton d'identification contenant les informations de base du profil (leur son nom, sa photo de profil et son adresse e-mail validée, que vous pouvez utiliser pour créez le nouveau compte.

La création d'un compte One Tap comprend deux étapes:

  • Intégrer le client One Tap à votre application, comme décrit sur cette page. Cette méthode revient à utiliser la connexion avec One Tap, à quelques différences près au niveau configuration.
  • Ajout à votre backend de la possibilité de créer des comptes utilisateur à partir de l'ID Google des jetons d'identification, qui sont abordés dans la section Utiliser des jetons d'ID sur le backend.

Où puis-je utiliser l'inscription avec One Tap ?

Pour proposer l'inscription avec One Tap aux utilisateurs, c'est dans un contexte où la connexion activerait de nouvelles fonctionnalités. Essayez d'abord de connecter l'utilisateur les identifiants enregistrés. Si aucun identifiant enregistré n'est trouvé, proposez de créer un le compte de l'utilisateur.

Avant de commencer

Configurez votre projet de console d'API Google et votre projet Android comme indiqué. dans Premiers pas avec la connexion avec One Tap.

1. Configurer le client One Tap

Pour configurer le client One Tap pour créer un compte, procédez comme suit:

  • Ne pas activer les demandes d'identifiants de mot de passe. (S'inscrire d'un simple geste n'est possible avec une authentification par jeton.)
  • Activer les requêtes de jetons d'ID Google à l'aide de setGoogleIdTokenRequestOptions() et ces paramètres:

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. Effectuer le suivi des résiliations dans l'interface utilisateur avec One Tap

Vous devez savoir si l'utilisateur a déjà refusé d'utiliser One Tap inscrivez-vous en fermant l'invite ou en appuyant à l'extérieur de celle-ci. Il peut s'agir de Il s'agit d'une propriété booléenne de votre Activity. (voir la section Arrêter l'affichage du bouton One Tap UI ci-dessous.)

3. Afficher l'interface utilisateur d'inscription à One Tap

Si l'utilisateur n'a pas refusé d'utiliser One Tap pour créer un compte, appelez le la méthode beginSignIn() de l'objet client et associez des écouteurs au Task qu'il . Les applications effectuent généralement cette étape lorsqu'une demande de connexion avec One Tap n'aboutit pas tous les identifiants enregistrés, c'est-à-dire dans l'écouteur d'échec de la requête sign-in requête.

Le client One Tap appelle l'écouteur de réussite si l'utilisateur a une ou plusieurs Comptes Google configurés sur l'appareil. Dans l'écouteur de réussite, obtenez la valeur intent à partir du résultat Task et le transmettre à startIntentSenderForResult() pour lancer l'interface utilisateur de One Tap.

Si l'utilisateur ne possède aucun compte Google sur l'appareil, le client One Tap appelle l'écouteur d'échecs. Dans ce cas, aucune action n'est requise de votre part: vous pouvez l'utilisateur peut simplement continuer à présenter l'expérience de l'application lorsqu'il est déconnecté inscrivez-vous en suivant le processus habituel de création de compte.

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. Gérer la réponse de l'utilisateur

La réponse de l'utilisateur à l'invite d'inscription à One Tap sera transmise à votre application. à l'aide de la méthode onActivityResult() de votre activité. Si l'utilisateur choisit de créer vous obtenez un jeton d'ID Google. Si l'utilisateur a refusé de s'inscrire, soit en fermant l'interface utilisateur de One Tap, soit en appuyant à l'extérieur, le résultat renvoie avec le code RESULT_CANCELED. Votre application doit gérer ces deux possibilités.

Créer un compte avec un jeton d'ID Google

Si l'utilisateur a choisi de s'inscrire avec un compte Google, vous pouvez obtenir un jeton d'ID pour l'utilisateur en transmettant les données d'intent de onActivityResult() à One Tap. la méthode getSignInCredentialFromIntent() du client. L'identifiant aura un propriété googleIdToken non nulle.

Utilisez le jeton d'identification pour créer un compte sur votre backend (voir S'authentifier avec un backend à l'aide de jetons d'ID) et connecter l'utilisateur.

Il contient également toutes les informations supplémentaires que vous avez demandées, telles que le numéro de téléphone validé du compte, si disponible.

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

Arrêter d'afficher l'interface utilisateur de One Tap

Si l'utilisateur a refusé de se connecter, l'appel à getSignInCredentialFromIntent() génère une ApiException avec un code d'état CommonStatusCodes.CANCELED. Dans ce cas, vous devez temporairement arrêter d'afficher l'interface utilisateur de connexion One Tap. afin de ne pas agacer vos utilisateurs avec des invites répétées. L'exemple suivant Pour ce faire, il définit une propriété sur l'activité, qu'il utilise pour déterminer si la connexion avec One Tap doit être proposée à l'utilisateur ; Cependant, vous pouvez aussi enregistrez une valeur dans SharedPreferences ou utilisez une autre méthode.

Il est important d'implémenter votre propre limitation du débit des invites de connexion One Tap. Si ce n'est pas le cas et qu'un utilisateur annule plusieurs invites d'affilée, le client One Tap n'invitera pas l'utilisateur au cours des prochaines 24 heures.

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

Étapes suivantes

Lorsqu'un utilisateur termine le processus d'inscription One Tap, vous recevez un jeton d'ID Google, qui contient des informations de base sur le profil: adresse e-mail de l'utilisateur, nom complet, et l'URL de la photo de profil. Pour de nombreuses applications, ces informations vous suffisent pour authentifier l'utilisateur sur le backend et créer un compte.

Si vous avez besoin d'informations supplémentaires pour créer votre compte, par exemple, la date de naissance de l'utilisateur, présentez à l'utilisateur un processus d'inscription, où vous demandez ces informations supplémentaires. Envoyez-la ensuite à votre backend pour terminer la création du compte.