Se você oferece suporte ao login com Contas do Google, use o login com um toque também proporcionem aos usuários uma experiência de criação de conta simples que nunca os tira do contexto do seu app.
Quando você exibe a interface de um toque, os usuários precisam criar uma nova conta com seu aplicativo usando uma das Contas do Google em seu dispositivo. Se o usuário escolher para continuar, você recebe um token de ID com informações básicas de perfil: nome, foto do perfil e endereço de e-mail verificado, que você pode usar para crie a nova conta.
A implementação da criação de contas com um toque tem duas partes:
- Integrar o cliente de um toque ao seu app, descrito nesta página. Isso é basicamente o mesmo que usar o login com um toque, mas com algumas diferenças configuração do Terraform.
- Adicionar ao back-end a capacidade de criar contas de usuário usando o ID do Google Isso é abordado em Como usar tokens de ID no back-end.
Onde devo usar a assinatura com um toque?
O lugar de maior impacto para oferecer a assinatura com um toque aos usuários é em um contexto em que fazer login ativaria novos recursos. Primeiro, tente fazer o login do usuário com uma credencial salva. Se nenhuma credencial salva for encontrada, ofereça a opção de criar uma nova para o usuário.
Antes de começar
Configure seu projeto do console de APIs do Google e projeto Android conforme descrito em Comece a usar o login com um toque.
1. Configurar o cliente de um toque
Para configurar o cliente de um toque para a criação da conta, faça o seguinte:
- Não ative solicitações de credenciais 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 criado nas APIs do Google console do Cloud. Esse é o ID do cliente do seu servidor, não seu ID do cliente Android.
- Configure o cliente para mostrar todas as Contas do Google no dispositivo que não filtre por contas autorizadas.
- Você também pode solicitar o telefone verificado número para a conta.
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 interface com um toque
Verifique se o usuário já recusou o uso com um toque. se inscreva ao fechar a solicitação ou tocar fora dela. Pode ser simples como uma propriedade booleana da atividade. Consulte Parar de exibir o recurso de um toque UI, abaixo).
3. Mostrar a interface de inscrição com um toque
Se o usuário não tiver recusado o uso de um toque para criar uma nova conta, chame o método
método beginSignIn()
do objeto do cliente e anexar listeners ao Task
retorna. Os apps geralmente realizam essa etapa quando uma solicitação de login com um toque não é encontrada
todas as credenciais salvas, ou seja, no listener de falha da interface de login
solicitação.
O cliente de um toque vai chamar o listener de êxito se o usuário tiver um ou mais
Contas do Google configuradas no dispositivo. No listener de sucesso, acesse o pendente
do resultado Task
e a transmita para startIntentSenderForResult()
para
iniciar a interface de um toque.
Se o usuário não tiver nenhuma Conta do Google no dispositivo, o cliente de um toque chamará o listener de falha. Nesse caso, nenhuma ação é necessária. Você pode continue apresentando a experiência do app sem fazer login, e o usuário poderá inscreva-se 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. Processar a resposta do usuário
A resposta do usuário à solicitação de inscrição com um toque será enviada ao app
usando o método onActivityResult()
da atividade. Se o usuário tiver optado por criar
o resultado será um token de ID do Google. Se o usuário não se inscrever,
seja fechando ou tocando fora da interface de um toque, o resultado retornará
pelo código RESULT_CANCELED
. Seu app precisa lidar com as duas possibilidades.
Criar uma conta com um token de ID do Google
Se o usuário tiver optado por se inscrever com uma Conta do Google, você poderá receber um token de ID para
o usuário transmitindo os dados da intent de onActivityResult()
para o recurso de um toque
método getSignInCredentialFromIntent()
do cliente. A credencial terá um
propriedade googleIdToken
não nula.
Use o token de ID para criar uma conta no back-end (consulte Autenticar com um back-end usando tokens de ID) e faça o login do usuário.
A credencial também contém outros detalhes que você solicitou, como o número de telefone verificado da conta, se disponível.
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 mostrar a interface de um toque
Se o usuário tiver recusado o login, a chamada para getSignInCredentialFromIntent()
vai gerar uma ApiException
com um código de status CommonStatusCodes.CANCELED
.
Quando isso acontecer, pare temporariamente de mostrar a interface de login com um toque
para não incomodar os usuários
com solicitações repetidas. O exemplo a seguir
faz isso definindo uma propriedade na Activity, que ela usa para
determinar se é necessário oferecer ao usuário o login com um toque; No entanto, também é possível
salve um valor em SharedPreferences
ou use algum outro método.
É importante implementar sua própria limitação de taxa das solicitações de login com um toque. Se você não fizer isso e um usuário cancelar várias solicitações seguidas, o cliente de um toque não solicitará ao usuário as 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óximas etapas
Quando um usuário conclui o fluxo de inscrição com um toque, 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 o URL da foto do perfil. Para muitos apps, essas informações são suficientes para você autenticar o usuário no back-end e criar uma nova conta.
Se você precisar de mais informações para concluir a criação da conta, como a data de nascimento do usuário: apresente a ele um fluxo de detalhes da inscrição, em que solicitar essas informações adicionais. Em seguida, envie-o ao back-end para concluir a criação da conta.