Questa pagina spiega come integrare reCAPTCHA nella tua app per Android.
Se vuoi fornire verifiche visive per il traffico sospetto, puoi utilizzare l'API reCAPTCHA di SafetyNet.
L'SDK utilizza la riflessione e il codice dinamico per consentire la modifica e il perfezionamento del sistema di rilevamento nelle applicazioni/gli SDK di cui è stato eseguito il deployment esistenti. L'insieme di classi disponibili nel sistema è limitato a un elenco controllato per evitare interferenze con l'applicazione.
Prima di iniziare
Crea una chiave reCAPTCHA per la piattaforma per app Android.
In alternativa, puoi copiare l'ID di una chiave reCAPTCHA esistente per Android eseguendo uno dei seguenti passaggi:
Per copiare l'ID di una chiave esistente dalla console Google Cloud, segui questi passaggi:
Vai alla pagina reCAPTCHA.
- Nell'elenco delle chiavi reCAPTCHA, posiziona il cursore del mouse sulla chiave che vuoi copiare e fai clic su .
- Per copiare l'ID di una chiave esistente utilizzando l'API REST, utilizza il metodo projects.keys.list.
- Per copiare l'ID di una chiave esistente utilizzando gcloud CLI, utilizza il comando gcloud recaptcha keys list.
Prepara l'ambiente Android
Android nativo
Prepara l'ambiente di sviluppo scaricando e installando l'ultima versione di Android Studio.
Assicurati di avere un'app con il valore SDK Android minimo impostato su API 23: Android 6.0 (Marshmallow). Puoi impostare l'SDK minimo della tua app sull'API 19 o creare una nuova app mobile.
Se stai creando una nuova app mobile, crea un'applicazione di test avviando un nuovo progetto Android Studio:
- Seleziona Svuota attività. Se vuoi utilizzare Jetpack Compose nella tua app, scegli Attività Compose vuota.
- Imposta la lingua su kotlin.
- Imposta il valore SDK minimo su API 23: Android 6.0 (Marshmallow).
Assicurati che il repository Maven di Google
google()
sia nell'elenco dei repository nel filebuild.gradle
a livello di progetto, come mostrato nel seguente snippet:allprojects { repositories { google() } }
Per ulteriori informazioni, consulta il repository Maven di Google.
Per aggiungere la dipendenza dall'API reCAPTCHA, aggiungi la seguente regola di compilazione alla sezione
dependencies
del filebuild.gradle
a livello di app.implementation 'com.google.android.recaptcha:recaptcha:18.7.0-beta01'
Per ulteriori informazioni sull'aggiunta di dipendenze nelle app per Android, consulta Aggiungere dipendenze di compilazione.
Aggiungi l'autorizzazione di accesso a internet tra il primo tag
<manifest>
e il primo<application>
nel file manifest dell'applicazione (ad esempio,AndroidManifest.xml
). Questa autorizzazione è obbligatoria perché l'API reCAPTCHA comporta operazioni di rete.<manifest ...> <uses-permission android:name="android.permission.INTERNET" /> <application ...> ... </application> </manifest>
Se vuoi utilizzare le librerie
AndroidX
nel nuovo progetto, compila l'SDK per Android 9.0 o versioni successive e aggiungi il seguente snippet di codice agradle.properties
.android.useAndroidX=true android.enableJetifier=true
Per ulteriori informazioni, consulta la pagina Eseguire la migrazione ad AndroidX.
Flutter
Per istruzioni dettagliate sull'utilizzo di reCAPTCHA tramite Flutter, consulta la documentazione di Flutter.
React Native
Per istruzioni dettagliate sull'utilizzo di reCAPTCHA tramite React Native, consulta la documentazione di React Native.
Integrare reCAPTCHA con l'app per Android
Crea un'istanza di un client utilizzando la chiave reCAPTCHA (KEY_ID) che hai creato per la tua app per Android.
Kotlin con
fetchClient
Il metodo
fetchClient
restituisce immediatamente un client e avvia l'inizializzazione dell'SDK in background. Riproverà a comunicare con il server reCAPTCHA in caso di errori di rete.class CustomApplication : Application() { private lateinit var recaptchaClient: RecaptchaClient override fun onCreate() { super.onCreate() initializeRecaptchaClient() } private fun initializeRecaptchaClient() { lifecycleScope.launch { try { recaptchaClient = Recaptcha.fetchClient(application, "KEY_ID") } catch(e: RecaptchaException) { // Handle errors ... // See "Handle errors" section } } } }
Java con
fetchClient
public final class CustomApplication extends Application { @Nullable private RecaptchaTasksClient recaptchaTasksClient = null; @Override protected void onCreate() { super.onCreate(); initializeRecaptchaClient(); } private void initializeRecaptchaClient() { Recaptcha .fetchTaskClient(getApplication(), "KEY_ID") .addOnSuccessListener( this, new OnSuccessListener<RecaptchaTasksClient>() { @Override public void onSuccess(RecaptchaTasksClient client) { MainActivity.this.recaptchaTasksClient = client; } }) .addOnFailureListener( this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle errors ... // See "Handle errors" section } }); } }
L'inizializzazione dell'SDK può richiedere diversi secondi. Per ridurre questa latenza, inizializza il client il prima possibile, ad esempio durante la
onCreate()
chiamata di unApplication
personalizzato. Non devi bloccare gli elementi dell'interfaccia utente nell'SDK reCAPTCHA.Per ogni azione della tua app protetta utilizzando reCAPTCHA, chiama il metodo
execute
passando un valore RecaptchaAction. reCAPTCHA fornisce un insieme di azioni predefinite e, se necessario, puoi creare azioni personalizzate.Il seguente snippet di codice mostra come utilizzare
execute
per proteggere un'azioneLOGIN
.Kotlin
private fun executeLoginAction() { lifecycleScope.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 ... } }); }
Esegui la migrazione dal metodo getClient al metodo fetchClient
Il metodo fetchClient
restituisce un RecaptchaClient
che riprova l'inizializzazione in caso di errori di rete. Se l'app non ha accesso alla rete quando viene creato il client, il client continua a riprovare e si inizializza correttamente quando viene acquisita una rete.
Se chiami execute(timeout)
e il client non è ancora pronto, tenta di inizializzarsi prima di restituire un token o un RecaptchaErrorCode.
L'esempio seguente mostra come eseguire la migrazione da getClient
a fetchClient
.
Kotlin
// Migrate from getClient
private fun initializeWithGetClient() {
lifecycleScope.launch {
Recaptcha.getClient(application, "KEY_ID")
.onSuccess { client ->
recaptchaClient = client
}
.onFailure { exception ->
// Handle errors ...
}
}
}
// Migrate to fetchClient
private fun initializeWithFetchClient() {
lifecycleScope.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 ...
}
});
}
Impostare un timeout per le chiamate API
Puoi specificare un valore di timeout per le API execute
utilizzando la proprietà withTimeout
.
Kotlin
Imposta il timeout quando chiami
execute
.lifecycleScope.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 } }
Questo snippet di codice imposta il timeout di
execute
su 10 secondi.
Java
Imposta il timeout quando chiami
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 } });
Questo snippet di codice imposta il timeout di
execute
su 10 secondi.
Gestire gli errori
Se la tua app non riesce a comunicare con il servizio reCAPTCHA, il motivo potrebbe essere che l'API ha rilevato un errore. Devi aggiungere la logica all'app per gestire in modo appropriato questi errori.
Per ulteriori dettagli sulle mitigazioni per gli errori comuni dell'API, consulta RecaptchaErrorCode.
Riferimento API
Per un riferimento completo dell'API reCAPTCHA per Android, consulta com.google.android.recaptcha
.
Passaggi successivi
Per valutare il token di risposta reCAPTCHA, crea una valutazione.