Negozio di blocchi

Molti utenti gestiscono ancora le proprie credenziali durante la configurazione di un nuovo dispositivo Android. Questo processo manuale può diventare complesso e spesso comporta un'esperienza utente scadente. L'API Block Store, una libreria basata su Google Play Services, cerca di risolvere questo problema fornendo alle app un modo per salvare le credenziali utente senza la complessità o il rischio per la sicurezza associati al salvataggio delle password utente.

L'API Block Store consente alla tua app di archiviare le credenziali utente che può successivamente recuperare per autenticare di nuovo gli utenti su un nuovo dispositivo. Questo contribuisce a offrire all'utente un'esperienza più fluida, in quanto non ha bisogno di visualizzare una schermata di accesso quando l'app viene avviata per la prima volta sul nuovo dispositivo.

I vantaggi dell'utilizzo del Block Store includono:

  • Soluzione di archiviazione delle credenziali criptate per gli sviluppatori. Se possibile, le credenziali vengono criptate end-to-end.
  • Salva i token anziché i nomi utente e le password.
  • Elimina le difficoltà dai flussi di accesso.
  • Evita agli utenti il compito di gestire password complesse.
  • Google verifica l'identità dell'utente.

Prima di iniziare

Per preparare l'app, completa i passaggi nelle sezioni seguenti.

Configura la tua app

Nel file build.gradle a livello di progetto, includi il repository Maven di Google nelle sezioni buildscript e allprojects:

buildscript {
  repositories {
    google()
    mavenCentral()
  }
}

allprojects {
  repositories {
    google()
    mavenCentral()
  }
}

Aggiungi la dipendenza da Google Play Services per l'API Block Store al tuo file di build Gradle del modulo, che viene in genere app/build.gradle:

dependencies {
  implementation 'com.google.android.gms:play-services-auth-blockstore:16.1.0'
}

Come funziona

Il Block Store è un meccanismo di accesso basato su token con crittografia end-to-end basato sull'infrastruttura di backup e ripristino. I seguenti passaggi spiegano come funziona un'app che utilizza Block Store:

  1. Durante il flusso di autenticazione dell'app o in un secondo momento, puoi archiviare il token di autenticazione dell'utente nel Block Store per recuperarlo in un secondo momento.
  2. Il token verrà archiviato in locale e potrà anche essere sottoposto a backup nel cloud, se possibile con crittografia end-to-end.
  3. I dati vengono trasferiti quando l'utente avvia un flusso di ripristino su un nuovo dispositivo.
  4. Se l'utente ripristina l'app durante il flusso di ripristino, l'app può recuperare il token salvato da Block Store sul nuovo dispositivo.

Salvataggio del token

Quando un utente accede alla tua app, puoi salvare nel Token Store il token di autenticazione che hai generato per quell'utente. Per farlo, chiama setBytes() su un'istanza di StoreBytesData.Builder per archiviare le credenziali dell'utente sul dispositivo di origine. Dopo essere stato salvato con Block Store, il token viene criptato e archiviato localmente sul dispositivo.

L'esempio seguente mostra come salvare il token di autenticazione sul dispositivo locale:

val client = Blockstore.getClient(this)
val data = StoreBytesData.Builder()
        .setBytes(/* BYTE_ARRAY */)
        .build()
client.storeBytes(data)
        .addOnSuccessListener{ result ->
            Log.d(TAG, "Stored: ${result} bytes")
        }
        .addOnFailureListener { e ->
            Log.e(TAG, “Failed to store bytes”, e)
        }

Recupero del token in corso...

In seguito, quando un utente esegue il flusso di ripristino su un nuovo dispositivo, Google Play Services verifica innanzitutto l'utente, quindi recupera i tuoi dati nel Blocca negozio. L'utente ha già accettato di ripristinare i dati della tua app come parte del flusso di ripristino, quindi non sono necessari ulteriori consensi. Quando l'utente apre la tua app, puoi richiedere il token al Block Store chiamando retrieveBytes(). Il token recuperato può quindi essere utilizzato per mantenere l'accesso dell'utente sul nuovo dispositivo.

L'esempio seguente mostra come recuperare il token criptato che era stato precedentemente memorizzato con Block Store:

val client = Blockstore.getClient(this)
client.retrieveBytes()
            .addOnSuccessListener { result ->
                Log.d(TAG, "Retrieved: ${String(result)}")
            }
            .addOnFailureListener { e ->
                Log.e(TAG, "Failed to retrieve bytes", e)
            }
}

Crittografia end-to-end

Affinché la crittografia end-to-end sia disponibile, il dispositivo deve eseguire Android 9 o versioni successive e l'utente deve aver impostato un blocco schermo (PIN, sequenza o password) per il suo dispositivo. Puoi verificare se la crittografia sarà disponibile sul dispositivo chiamando isEndToEndEncryptionAvailable().

L'esempio seguente mostra come verificare se la crittografia sarà disponibile durante il backup sul cloud:

client.isEndToEndEncryptionAvailable()
        .addOnSuccessListener { result ->
          Log.d(TAG, "Will Block Store cloud backup be end-to-end encrypted? $result")
        }

Attiva backup sul cloud

Per abilitare il backup sul cloud, aggiungi il metodo setShouldBackupToCloud() all'oggetto StoreBytesData. Il Block Store esegue periodicamente il backup nel cloud dei byte archiviati quando setShouldBackupToCloud() è impostato su true.

L'esempio seguente mostra come abilitare il backup sul cloud solo quando il backup sul cloud è criptato end-to-end:

val client = Blockstore.getClient(this)
val storeBytesDataBuilder = StoreBytesData.Builder()
        .setBytes(/* BYTE_ARRAY */)

client.isEndToEndEncryptionAvailable()
        .addOnSuccessListener { isE2EEAvailable ->
          if (isE2EEAvailable) {
            storeBytesDataBuilder.setShouldBackupToCloud(true)
            Log.d(TAG, "E2EE is available, enable backing up bytes to the cloud.")

            client.storeBytes(storeBytesDataBuilder.build())
                .addOnSuccessListener { result ->
                  Log.d(TAG, "stored: ${result.getBytesStored()}")
                }.addOnFailureListener { e ->
                  Log.e(TAG, “Failed to store bytes”, e)
                }
          } else {
            Log.d(TAG, "E2EE is not available, only store bytes for D2D restore.")
          }
        }

Come eseguire il test

Utilizza i seguenti metodi durante lo sviluppo per testare i flussi di ripristino.

Disinstallazione/riinstallazione del dispositivo stesso

Se l'utente attiva i servizi di backup (puoi controllarlo dalla pagina Impostazioni > Google > Backup), i dati dell'archivio dei blocchi vengono conservati per tutta la disinstallazione/installazione dell'app.

Per eseguire il test, puoi procedere nel seguente modo:

  1. Integra l'API BlockStore nella tua app di prova.
  2. Utilizza l'app di test per richiamare l'API BlockStore per archiviare i tuoi dati.
  3. Disinstalla l'app di prova e reinstallala sullo stesso dispositivo.
  4. Utilizza l'app di test per richiamare l'API BlockStore per recuperare i tuoi dati.
  5. Verifica che i byte recuperati siano gli stessi di quelli memorizzati prima della disinstallazione.

Da dispositivo a dispositivo

Nella maggior parte dei casi, sarà necessario ripristinare i dati di fabbrica del dispositivo di destinazione. Puoi quindi accedere al flusso di ripristino wireless di Android o al ripristino del cavo Google (per i dispositivi supportati).

Ripristino nel cloud

  1. Integra l'API Blockstore nella tua app di prova. L'app di test deve essere inviata al Play Store.
  2. Sul dispositivo di origine, utilizza l'app di test per richiamare l'API Blockstore, archiviare i tuoi dati, con shouldBackUpToCloud impostato su true.
  3. Per i dispositivi O e superiori, puoi attivare manualmente il backup su cloud di Block Store: vai a Settings > Google > Backup e fai clic sul pulsante "Effettua ora il backup".
    1. Per verificare che il backup nel cloud di Block Store sia riuscito, puoi:
      1. Al termine del backup, cerca righe di log con il tag "CloudSyncBpTkSvc".
      2. Dovresti vedere righe come queste: "......, CloudSyncBpTkSvc: sync result: SUCCESS, ..., dimensione caricata: XXX byte ..."
    2. Dopo un backup sul cloud del Block Store, si verifica un periodo di "raffreddamento" di 5 minuti. Entro 5 minuti, il clic sul pulsante "Effettua ora il backup" non attiverà un altro backup sul cloud del Block Store.
  4. Ripristina i dati di fabbrica del dispositivo di destinazione e segui un flusso di ripristino sul cloud. Seleziona per ripristinare l'app di test durante il flusso di ripristino. Per ulteriori informazioni sui flussi di ripristino cloud, vedi Flussi di ripristino cloud supportati.
  5. Sul dispositivo di destinazione, utilizza l'app di test per richiamare l'API Blockstore per il recupero dei dati.
  6. Verifica che i byte recuperati corrispondano a quelli archiviati nel dispositivo di origine.

Requisiti dei dispositivi

Crittografia end-to-end

  • La crittografia end-to-end è supportata sui dispositivi con Android 9 (API 29) e versioni successive.
  • Sul dispositivo deve essere impostato un blocco schermo con un PIN, una sequenza o una password per attivare la crittografia end-to-end e criptare correttamente i dati dell'utente.

Flusso di ripristino da dispositivo a dispositivo

Il ripristino da dispositivo a dispositivo richiederà un dispositivo di origine e un dispositivo di destinazione. Questi saranno i due dispositivi che trasferiscono i dati.

Per eseguire il backup, i dispositivi di origine devono avere un sistema operativo Android 6 (API 23) o versioni successive.

Eseguire il targeting dei dispositivi con Android 9 (API 29) e versioni successive per poterli ripristinare.

Ulteriori informazioni sul flusso di ripristino del dispositivo sono disponibili qui.

Flusso di backup e ripristino del cloud

Il backup e il ripristino nel cloud richiede un dispositivo di origine e un dispositivo di destinazione.

Per eseguire il backup, i dispositivi di origine devono avere un sistema operativo Android 6 (API 23) o versioni successive.

I dispositivi target sono supportati in base ai relativi fornitori. I dispositivi Pixel possono utilizzare questa funzionalità da Android 9 (API 29) e tutti gli altri dispositivi devono avere Android 12 (API 31) o versioni successive.