Integra Google Cloud Fraud Defense con le app per Android

Puoi integrare Google Cloud Fraud Defense nelle app per Android per valutare l'integrità dei dispositivi client e proteggere le interazioni sensibili degli utenti mobile.

L'SDK utilizza la riflessione e il codice dinamico per consentire la modifica e il perfezionamento del sistema di rilevamento nelle applicazioni/SDK esistenti di cui è stato eseguito il deployment. L'insieme di classi disponibili nel sistema è limitato a un elenco controllato per evitare interferenze con l'applicazione.

Prima di iniziare

  1. Prepara il tuo ambiente per Google Cloud Fraud Defense.

  2. Crea una chiave reCAPTCHA per la piattaforma di app per 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 consoleGoogle Cloud , segui questi passaggi:

      1. Vai alla pagina Google Cloud Fraud Defense.

        Vai a Google Cloud Fraud Defense

      2. Seleziona la scheda Chiavi.
      3. Nell'elenco delle chiavi reCAPTCHA, trova la 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

  1. Prepara l'ambiente di sviluppo scaricando e installando l'ultima versione di Android Studio.

  2. Assicurati di avere un'app con il valore minimo dell'SDK Android impostato su API 23: Android 6.0 (Marshmallow).

  3. Se stai creando una nuova app mobile, crea un'applicazione di test avviando un nuovo progetto Android Studio:

    1. Seleziona Empty Activity (Attività vuota). Se vuoi utilizzare Jetpack Compose nella tua app, scegli Empty Compose Activity.
    2. Imposta la lingua su kotlin.
    3. Imposta il valore minimo dell'SDK su API 23: Android 6.0 (Marshmallow).
  4. Assicurati che il repository Maven di Google google() sia presente nell'elenco dei repository nel file build.gradle a livello di progetto, come mostrato nello snippet seguente:

    allprojects {
        repositories {
            google()
        }
    }
    

    Per saperne di più, consulta il repository Maven di Google.

  5. Per aggiungere la dipendenza dell'API reCAPTCHA, aggiungi la seguente regola di build alla sezione dependencies del file build.gradle a livello di app.

      implementation 'com.google.android.recaptcha:recaptcha:18.9.4'
    

    Per saperne di più sull'aggiunta di dipendenze nelle app per Android, consulta Aggiungi dipendenze di build.

  6. Aggiungi l'autorizzazione per internet tra il primo tag <manifest> e il primo tag <application> nel manifest dell'applicazione (ad esempio, AndroidManifest.xml). Questa autorizzazione è obbligatoria perché l'API reCAPTCHA prevede operazioni di rete.

    <manifest ...>
    
        <uses-permission android:name="android.permission.INTERNET" />
    
        <application ...>
        ...
      </application>
    </manifest>
    
  7. Se vuoi utilizzare le librerie AndroidX nel tuo nuovo progetto, compila l'SDK per Android 9.0 o versioni successive e aggiungi il seguente snippet di codice al tuo gradle.properties.

    android.useAndroidX=true
    android.enableJetifier=true
    

    Per maggiori informazioni, consulta la pagina Migrazione ad AndroidX.

Flutter

Per istruzioni dettagliate sull'utilizzo di reCAPTCHA tramite Flutter, consulta la documentazione di Flutter.

React Native

Per istruzioni dettagliate su come utilizzare reCAPTCHA tramite React Native, consulta la documentazione di React Native.

Integra reCAPTCHA con la tua app per Android

  1. 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. In caso di errori di rete, riprova a comunicare con il server reCAPTCHA.

    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 con fetchClient

    public 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
                }
              });
      }
    }
    

    L'inizializzazione dell'SDK può richiedere diversi secondi. Per ridurre questa latenza, inizializza il client il prima possibile, ad esempio durante la chiamata onCreate() di una classe Application personalizzata. Non devi fare in modo che gli elementi UI blocchino l'SDK reCAPTCHA.

  2. Per ogni azione della tua app protetta utilizzando reCAPTCHA, chiama il metodo execute passando un RecaptchaAction. La libreria reCAPTCHA fornisce un insieme di azioni integrate e, se necessario, puoi creare azioni personalizzate.

    Il seguente snippet di codice mostra come utilizzare execute per proteggere un'azione LOGIN.

    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 ...
              }
            });
    }
    

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, quest'ultimo continua a riprovare e viene inizializzato 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() {
  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 ...
            }
          });
  }

Imposta 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.

        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
            }
        }
    

    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.

Gestisci gli errori

Se la tua app non riesce a comunicare correttamente con il servizio reCAPTCHA, è possibile che l'API abbia riscontrato un errore. Devi aggiungere la logica nella tua app per gestire correttamente questi errori.

Per maggiori dettagli sulle mitigazioni degli 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.