Block Store

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

L'API Block Store consente alla tua app di archiviare le credenziali utente che può recuperare in seguito per riautenticare gli utenti su un nuovo dispositivo. Questo aiuta a fornire un'esperienza più fluida per l'utente, in quanto non è necessario che visualizzi una schermata di accesso quando avvia l'app per la prima volta sul nuovo dispositivo.

I vantaggi dell'utilizzo di Block Store includono quanto segue:

  • Soluzione di archiviazione delle credenziali crittografate per gli sviluppatori. Le credenziali sono crittografate end-to-end quando possibile.
  • Salva i token invece di nomi utente e password.
  • Elimina l'attrito dai flussi di accesso.
  • Risparmia agli utenti l'onere di gestire password complesse.
  • Google verifica l'identità dell'utente.

Prima di iniziare

Per preparare la tua app, completa i passaggi nelle sezioni seguenti.

Configura la tua app

Nel tuo 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 dei servizi di Google Play per l'API Block Store al file di build Gradle del tuo modulo , che è comunemente app/build.gradle :

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

Come funziona

Block store è un meccanismo di accesso basato su token crittografato end-to-end e basato sull'infrastruttura di backup e ripristino. I seguenti passaggi descrivono come funzionerebbe un'app che utilizza Block Store:

  1. Durante il flusso di autenticazione della tua app o in qualsiasi momento successivo, puoi archiviare il token di autenticazione dell'utente in Block Store per un successivo recupero.
  2. Il token verrà archiviato localmente e può anche essere eseguito il backup nel cloud, crittografato end-to-end quando possibile.
  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 il token di autenticazione che generi per quell'utente in Block Store. Questo viene fatto chiamando setBytes() su un'istanza di StoreBytesData.Builder per memorizzare le credenziali dell'utente nel dispositivo di origine. Dopo aver salvato il token con Block Store, il token viene crittografato e archiviato localmente sul dispositivo.

L'esempio seguente mostra come salvare il token di autenticazione nel 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.getBytesStored()}")
        }
        .addOnFailureListener { e ->
            Log.e(TAG, “Failed to store bytes”, e)
        }

Recupero del token

Successivamente, quando un utente esegue il flusso di ripristino su un nuovo dispositivo, i servizi di Google Play prima verificano l'utente, quindi recupera i dati del Block Store. L'utente ha già accettato di ripristinare i dati dell'app come parte del flusso di ripristino, quindi non sono richiesti consensi aggiuntivi. Quando l'utente apre la tua app, puoi richiedere il tuo token da 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 crittografato precedentemente archiviato 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

Per rendere disponibile la crittografia end-to-end, il dispositivo deve eseguire Android 9 o versioni successive e l'utente deve aver impostato un blocco schermo (PIN, sequenza o password) per il proprio dispositivo. È possibile verificare se la crittografia sarà disponibile sul dispositivo chiamando isEndToEndEncryptionAvailable() .

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

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

Abilita il backup su cloud

Per abilitare il backup su cloud, aggiungi il metodo setShouldBackupToCloud() al tuo oggetto StoreBytesData . Block Store eseguirà periodicamente il backup nel cloud dei byte archiviati quando setShouldBackupToCloud() è impostato su true.

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

val client = Blockstore.getClient(this)
val storeBytesDataBuilder = StoreBytesData.Builder()
        .setBytes(/* BYTE_ARRAY */)
        .build()
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 testare

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

Stesso dispositivo di disinstallazione/reinstallazione

Se l'utente abilita i servizi di backup (può essere verificato in Impostazioni > Google > Backup ), i dati di Block Store vengono mantenuti durante la disinstallazione/reinstallazione dell'app.

Puoi seguire questi passaggi per testare:

  1. Integra l'API BlockStore nella tua app di test.
  2. Usa l'app di test per richiamare l'API BlockStore per archiviare i tuoi dati.
  3. Disinstalla l'app di prova, quindi reinstalla l'app sullo stesso dispositivo.
  4. Usa l'app di test per richiamare l'API BlockStore per recuperare i tuoi dati.
  5. Verificare che i byte recuperati corrispondano a quelli archiviati prima della disinstallazione.

Da dispositivo a dispositivo

Nella maggior parte dei casi, ciò richiederà un ripristino delle impostazioni di fabbrica del dispositivo di destinazione. È quindi possibile accedere al flusso di ripristino wireless di Android o al ripristino del cavo di Google (per i dispositivi supportati).

Ripristino su cloud

  1. Integra l'API Blockstore nella tua app di prova. L'app di prova deve essere inviata al Play Store.
  2. Sul dispositivo di origine, usa l'app di test per richiamare l'API Blockstore per archiviare i tuoi dati, con shouldBackUpToCloud impostato su true.
  3. Per i dispositivi O e superiori, puoi attivare manualmente un backup su cloud Block Store: vai su Impostazioni > Google > Backup , fai clic sul pulsante "Esegui backup ora".
    1. Per verificare che il backup su cloud di Block Store sia riuscito, puoi:
      1. Al termine del backup, cerca le righe di registro con il tag "CloudSyncBpTkSvc".
      2. Dovresti vedere righe come questa: "......, CloudSyncBpTkSvc: sync result: SUCCESS, ..., uploaded size: XXX bytes ..."
    2. Dopo un backup su cloud di Block Store, c'è un periodo di "raffreddamento" di 5 minuti. Entro quei 5 minuti, facendo clic sul pulsante "Esegui backup ora" non verrà attivato un altro backup cloud di Block Store.
  4. Ripristina le impostazioni di fabbrica del dispositivo di destinazione e segui un flusso di ripristino cloud. Seleziona per ripristinare l'app di prova durante il flusso di ripristino. Per ulteriori informazioni sui flussi di ripristino cloud, consulta Flussi di ripristino cloud supportati .
  5. Sul dispositivo di destinazione, usa l'app di test per richiamare l'API Blockstore per recuperare i tuoi dati.
  6. Verificare che i byte recuperati corrispondano a quelli archiviati nel dispositivo di origine.