É possível integrar o Google Cloud Fraud Defense aos apps Android para avaliar a integridade do dispositivo cliente e proteger as interações confidenciais do usuário em dispositivos móveis.
O SDK usa reflexão e código dinâmico para permitir a modificação e o refinamento do sistema de detecção nos aplicativos/SDKs implantados. O conjunto de classes disponíveis no sistema é restrito a uma lista controlada para evitar interferência no aplicativo.
Antes de começar
Crie uma chave de reCAPTCHA para a plataforma de app Android.
Como alternativa, você pode copiar o ID de uma chave reCAPTCHA para Android seguindo uma destas etapas:
Para copiar o ID de uma chave do console doGoogle Cloud , faça o seguinte:
Acesse a página do Google Cloud Fraud Defense.
- Selecione a guia Chaves.
- Na lista de chaves reCAPTCHA, encontre a chave que você quer copiar e clique em .
- Para copiar o ID de uma chave usando a API REST, use o método projects.keys.list.
- Para copiar o ID de uma chave usando a CLI gcloud, use o comando gcloud recaptcha keys list.
Preparar o ambiente do Android
Android nativo
Prepare seu ambiente de desenvolvimento fazendo o download e instalando a versão mais recente do Android Studio.
Verifique se você tem um app com o valor mínimo do SDK do Android definido como API 23: Android 6.0 (Marshmallow).
Se você estiver criando um novo app para dispositivos móveis, crie um aplicativo de teste iniciando um novo projeto do Android Studio:
- Selecione Empty Activity. Se você quiser usar o Jetpack Compose no seu app, escolha Empty Compose Activity.
- Defina a linguagem como kotlin.
- Defina o valor mínimo do SDK como API 23: Android 6.0 (Marshmallow).
Verifique se o repositório Maven do Google
google()está na lista de repositórios no arquivobuild.gradleno nível do projeto, conforme mostrado no snippet a seguir:allprojects { repositories { google() } }Para mais informações, consulte a seção Repositório Maven do Google.
Para adicionar a dependência da API reCAPTCHA, adicione a seguinte regra de build à seção
dependenciesdo arquivobuild.gradleno nível do app.implementation 'com.google.android.recaptcha:recaptcha:18.9.4'Para mais informações sobre como adicionar dependências em apps Android, consulte Adicionar dependências de build.
Adicione a permissão de Internet entre a primeira tag
<manifest>e a primeira tag<application>no manifesto do aplicativo (por exemplo,AndroidManifest.xml). Essa permissão é necessária porque a API reCAPTCHA envolve operações de rede.<manifest ...> <uses-permission android:name="android.permission.INTERNET" /> <application ...> ... </application> </manifest>Se você quiser usar bibliotecas
AndroidXno seu novo projeto, compile o SDK para o Android 9.0 ou versão mais recente e adicione o seguinte snippet de código aogradle.properties.android.useAndroidX=true android.enableJetifier=truePara mais informações, consulte Como migrar para o AndroidX.
Flutter
Para instruções detalhadas sobre como usar o reCAPTCHA pelo Flutter, consulte a documentação do Flutter.
React Native
Para instruções detalhadas sobre como usar o reCAPTCHA pelo React Native, consulte a documentação do React Native.
Integrar o reCAPTCHA ao seu app Android
Instancie um cliente usando a chave reCAPTCHA (KEY_ID) que você criou para o app Android.
Kotlin com
fetchClientO método
fetchClientretorna um cliente imediatamente e começa a inicializar o SDK em segundo plano. Ele tenta novamente a comunicação com o servidor do reCAPTCHA em caso de falhas de rede.class CustomApplication : Application() { private lateinit var recaptchaClient: RecaptchaClient // we recommend initializing in a ViewModel private val recaptchaScope = CoroutineScope(Dispatchers.IO) override fun onCreate() { super.onCreate() initializeRecaptchaClient() } private fun initializeRecaptchaClient() { recaptchaScope.launch { try { recaptchaClient = Recaptcha.fetchClient(this@CustomApplication, "KEY_ID") } catch(e: RecaptchaException) { // Handle errors ... // See "Handle errors" section } } } }Java com
fetchClientpublic final class CustomApplication extends Application { @Nullable private RecaptchaTasksClient recaptchaTasksClient = null; @Override public void onCreate() { super.onCreate(); initializeRecaptchaClient(); } private void initializeRecaptchaClient() { Recaptcha .fetchTaskClient(this, "KEY_ID") .addOnSuccessListener( this, new OnSuccessListener<RecaptchaTasksClient>() { @Override public void onSuccess(RecaptchaTasksClient client) { CustomApplication.this.recaptchaTasksClient = client; } }) .addOnFailureListener( this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle errors ... // See "Handle errors" section } }); } }A inicialização do SDK pode levar vários segundos para ser concluída. Para reduzir essa latência, inicialize o cliente o mais cedo possível, como durante a chamada
onCreate()de uma classeApplicationpersonalizada. Não bloqueie elementos da interface no SDK do reCAPTCHA.Para cada ação do app protegida pelo reCAPTCHA, chame o método
executetransmitindo um RecaptchaAction. A biblioteca do reCAPTCHA oferece um conjunto integrado de ações e, se necessário, você pode criar ações personalizadas.O snippet de código abaixo mostra como usar
executepara proteger uma açãoLOGIN.Kotlin
private fun executeLoginAction() { recaptchaScope.launch { recaptchaClient .execute(RecaptchaAction.LOGIN) .onSuccess { token -> // Handle success ... // See "What's next" section for instructions // about handling tokens. } .onFailure { exception -> // Handle errors ... } } }Java
private void executeLoginAction(View v) { assert recaptchaTasksClient != null; recaptchaTasksClient .executeTask(RecaptchaAction.LOGIN) .addOnSuccessListener( this, new OnSuccessListener<String>() { @Override public void onSuccess(String token) { // Handle success ... // See "What's next" section for instructions // about handling tokens. } }) .addOnFailureListener( this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle errors ... } }); }
Migrar do método getClient para o método fetchClient
O método fetchClient retorna um RecaptchaClient
que tenta fazer a inicialização novamente em caso de falhas de rede. Se o app não tiver
acesso à rede quando o cliente for criado, ele vai continuar tentando e
será inicializado quando uma rede for adquirida.
Se você chamar execute(timeout) e o cliente ainda não estiver pronto, ele vai tentar
fazer a inicialização antes de retornar um token ou um RecaptchaErrorCode.
O exemplo a seguir mostra como migrar de getClient para fetchClient.
Kotlin
// Migrate from getClient
private fun initializeWithGetClient() {
recaptchaScope.launch {
Recaptcha.getClient(application, "KEY_ID")
.onSuccess { client ->
recaptchaClient = client
}
.onFailure { exception ->
// Handle errors ...
}
}
}
// Migrate to fetchClient
private fun initializeWithFetchClient() {
recaptchaScope.launch {
try {
recaptchaClient = Recaptcha.fetchClient(application, "KEY_ID")
} catch(e: RecaptchaException){
// Handle errors ...
}
}
}
Java
// Migrate from getTasksClient
private void initializeWithGetTasksClient() {
Recaptcha
.getTasksClient(getApplication(), "KEY_ID")
.addOnSuccessListener(
this,
new OnSuccessListener<RecaptchaTasksClient>() {
@Override
public void onSuccess(RecaptchaTasksClient client) {
recaptchaTasksClient = client;
}
})
.addOnFailureListener(
this,
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Handle errors ...
}
});
}
// Migrate to fetchTaskClient
private void initializeWithFetchTaskClient() {
Recaptcha
.fetchTaskClient(getApplication(), "KEY_ID")
.addOnSuccessListener(
this,
new OnSuccessListener<RecaptchaTasksClient>() {
@Override
public void onSuccess(RecaptchaTasksClient client) {
recaptchaTasksClient = client;
}
})
.addOnFailureListener(
this,
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Handle errors ...
}
});
}
Definir um tempo limite para chamadas de API
É possível especificar um valor de tempo limite para as APIs execute usando a
propriedade withTimeout.
Kotlin
Defina o tempo limite ao chamar
execute.recaptchaScope.launch { recaptchaClient .execute(RecaptchaAction.LOGIN, timeout = 10000L) .onSuccess { token -> // Handle success ... // See "What's next" section for instructions // about handling tokens. } .onFailure { exception -> // Handle errors ... // See "Handle errors" section } }Esse snippet de código define o tempo limite de
executecomo 10 segundos.
Java
Defina o tempo limite ao chamar
execute.recaptchaTasksClient .executeTask(RecaptchaAction.custom("redeem"), 10000L) .addOnSuccessListener( this, new OnSuccessListener<String>() { @Override public void onSuccess(String token) { // Handle success ... // See "What's next" section for instructions // about handling tokens. } }) .addOnFailureListener( this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle errors ... // See "Handle errors" section } });Esse snippet de código define o tempo limite de
executecomo 10 segundos.
Tratar erros
Se o app não conseguir se comunicar com o serviço reCAPTCHA, pode ser porque a API encontrou um erro. Adicione uma lógica ao app para lidar com esses erros de maneira adequada.
Para mais detalhes sobre mitigações de erros comuns da API, consulte RecaptchaErrorCode.
Referência da API
Para uma referência completa da API reCAPTCHA para Android,
consulte com.google.android.recaptcha.
A seguir
Para avaliar o token de resposta do reCAPTCHA, crie uma avaliação.