Aviso: esses dados são fornecidos de acordo com a Política de dados do usuário do Google . Reveja e cumpra a política. Não fazer isso pode resultar na suspensão do projeto ou suspensão da conta.

Crie novas contas com um toque

Se você oferece suporte para login com Contas do Google, pode usar o cliente de login One Tap para oferecer aos usuários uma experiência de criação de conta sem problemas, que nunca os tira do contexto do seu aplicativo.

IU de inscrição com um toque

Quando você exibe a IU do One Tap, os usuários são solicitados a criar uma nova conta com seu aplicativo usando uma das Contas do Google em seus dispositivos. Se o usuário decidir continuar, você receberá um token de ID com informações básicas de perfil - nome, foto de perfil e endereço de e-mail verificado - que pode ser usado para criar a nova conta.

A implementação da criação de uma conta One Tap tem duas partes:

  • Integrar o cliente One Tap em seu aplicativo, que é descrito nesta página. Isso é basicamente o mesmo que usar o login com um toque, mas com algumas diferenças na configuração.
  • Adicionar ao seu back-end a capacidade de criar contas de usuário a partir de tokens de ID do Google, que é discutido em Uso de tokens de ID no back-end .

Onde devo usar a inscrição do One Tap?

O lugar mais impactante para oferecer a inscrição One Tap aos usuários é em um contexto em que o login permitiria novos recursos. Primeiro, tente conectar o usuário com uma credencial salva. Se nenhuma credencial salva for encontrada, ofereça-se para criar uma nova conta para o usuário.

Antes de você começar

Configure seu projeto de console de APIs do Google e projeto Android conforme descrito em Primeiros passos com o login do One Tap

1. Configure o cliente One Tap

Para configurar o cliente One Tap para criação de conta, faça o seguinte:

  • Não habilite solicitações de credencial de senha. (A inscrição com um toque só é possível com autenticação baseada em token).
  • Ative as solicitações de token de ID do Google usando setGoogleIdTokenRequestOptions() e estas configurações:

    • Defina o ID do cliente do servidor como o ID que você criou no console de APIs do Google . Observe que este é o ID do cliente do seu servidor, não o ID do cliente Android.
    • Configure o cliente para mostrar todas as contas do Google no dispositivo, ou seja, não filtre por contas autorizadas.

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. Acompanhe o cancelamento da IU One Tap

Você deve acompanhar se o usuário já se recusou a usar a inscrição One Tap fechando o prompt ou tocando fora dele. Isso pode ser tão simples quanto uma propriedade booleana de sua atividade. (Consulte Parar de exibir a IU do One Tap , abaixo.)

3. Exibir a IU de inscrição do One Tap

Se o usuário não recusou o uso do One Tap para criar uma nova conta, chame o método beginSignIn() do objeto cliente e anexe ouvintes à Task ele retorna. Aplicativos normalmente fazer este passo quando uma Um Toque de sessão pedido não encontrar quaisquer credenciais-que salva é, no ouvinte falha do sinal- no pedido.

O cliente One Tap chamará o ouvinte de sucesso se o usuário tiver uma ou mais Contas do Google configuradas no dispositivo. No ouvinte de sucesso, obtenha o intent pendente do resultado da Task e passe-o para startIntentSenderForResult() para iniciar a IU do One Tap.

Se o usuário não tiver nenhuma Conta do Google no dispositivo, o cliente One Tap ligará para o listener de falha. Nesse caso, nenhuma ação é necessária: você pode simplesmente continuar apresentando a experiência desconectada do aplicativo e o usuário pode se inscrever com seu fluxo normal de criação de conta.

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. Lidar com a resposta do usuário

A resposta do usuário ao prompt de inscrição do One Tap será relatada ao seu aplicativo usando o método onActivityResult() sua Activity. Se o usuário optar por criar uma conta, o resultado será um token de ID do Google. Se o usuário recusou a inscrição, fechando a IU do One Tap ou tocando fora dela, o resultado retornará com o código RESULT_CANCELED . Seu aplicativo precisa lidar com as duas possibilidades.

Crie uma conta com um token de ID do Google

Se o usuário escolheu se inscrever com uma Conta do Google, você pode obter um token de ID para o usuário, passando os dados de onActivityResult() de onActivityResult() para o método getSignInCredentialFromIntent() do cliente One Tap A credencial terá uma propriedade googleIdToken não nula.

Use o token de ID para criar uma conta em seu back-end (consulte Autenticar com um back-end usando tokens de ID ) e faça o login do usuário.

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

Parar de exibir a IU do One Tap

Se o usuário se recusou a getSignInCredentialFromIntent() , a chamada para getSignInCredentialFromIntent() lançará uma ApiException com um código de status CommonStatusCodes.CANCELED . Quando isso acontecer, você deve interromper temporariamente a exibição da IU de login do One Tap para não incomodar os usuários com solicitações repetidas. O exemplo a seguir faz isso definindo uma propriedade na Activity, que é usada para determinar se deve oferecer ao usuário a entrada One Tap; no entanto, você também pode salvar um valor em SharedPreferences ou usar algum outro método.

É importante implementar sua própria limitação de taxa de prompts de login do One Tap. Do contrário, e um usuário cancela vários prompts em uma linha, o cliente One Tap não solicitará o usuário nas próximas 24 horas.

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

Próximos passos

Quando um usuário conclui o fluxo de inscrição do One Tap, você recebe um token de ID do Google, que inclui algumas informações básicas de perfil: o endereço de e-mail do usuário, nome completo e URL da foto do perfil. Para muitos aplicativos, essa informação é suficiente para você autenticar o usuário no back-end e criar uma nova conta.

Se você precisar de informações adicionais para concluir a criação da conta - por exemplo, a data de nascimento do usuário - apresente ao usuário um fluxo de detalhes de inscrição, onde você solicita essas informações adicionais. Em seguida, envie-o para seu back-end para concluir a criação da conta.