Negozio di blocchi

Molti utenti gestiscono ancora le proprie credenziali durante la configurazione di un nuovo dispositivo Android. Questo processo manuale può diventare difficile e spesso comporta un'esperienza utente scadente. L'API Block Store, una libreria basata su Google Play Services, cerca di risolvere il 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 memorizzare le credenziali utente, che in un secondo momento possono recuperare per autenticare di nuovo gli utenti su un nuovo dispositivo. Questo consente di offrire un'esperienza più fluida all'utente, dal momento che non ha bisogno di visualizzare una schermata di accesso quando avvia l'app per la prima volta sul nuovo dispositivo.

I vantaggi dell'utilizzo di Block Store includono:

  • Soluzione di archiviazione di credenziali criptate per gli sviluppatori. Le credenziali sono criptate end-to-end quando possibile.
  • Salva i token anziché i nomi utente e le password.
  • Elimina le difficoltà nei flussi di accesso.
  • Evita agli utenti la necessità di gestire password complesse.
  • Google verifica l'identità dell'utente.

Prima di iniziare

Per preparare l'app, completa i passaggi riportati 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 Google Play Services per l'API Block Store al tuo file di build Gradle del modulo, che viene 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 criptato end-to-end e basato sull'infrastruttura di backup e ripristino. I passaggi seguenti spiegano come funziona un'app che utilizza Block Store:

  1. Durante il flusso di autenticazione dell'app o in un secondo momento, puoi memorizzare il token di autenticazione dell'utente nel Block Store per recuperarlo in un secondo momento.
  2. Il token verrà archiviato localmente e potrai anche eseguirne il backup sul cloud, con crittografia 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 dal Block Store sul nuovo dispositivo.

Salvataggio del token

Quando un utente accede alla tua app, puoi salvare il token di autenticazione generato per tale utente nel Block Store. A tal fine, si chiama setBytes() su un'istanza di StoreBytesData.Builder per archiviare le credenziali dell'utente sul dispositivo di origine. Una volta salvato con il 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 seguito, quando un utente esegue il flusso di ripristino su un nuovo dispositivo, Google Play Services verifica innanzitutto l'utente, quindi recupera i dati del tuo blocco dello Store. L'utente ha già accettato di ripristinare i dati dell'app nell'ambito del flusso di ripristino, quindi non sono necessari altri consensi. Quando l'utente apre l'app, puoi richiedere il token al Block Store chiamando retrieveBytes(). Il token recuperato potrà quindi essere utilizzato per mantenere l'utente collegato sul nuovo dispositivo.

L'esempio seguente mostra come recuperare il token criptato che è 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, sul dispositivo deve essere installato Android 9 o versioni successive e l'utente deve aver impostato un blocco schermo (PIN, sequenza o password) per il proprio dispositivo. Puoi verificare se la crittografia sarà disponibile sul dispositivo chiamando il numero isEndToEndEncryptionAvailable().

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

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

Attiva backup nel cloud

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

L'esempio seguente mostra come attivare 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

Durante il processo di sviluppo, utilizza i seguenti metodi per testare i flussi di ripristino.

Disinstalla/reinstalla lo stesso dispositivo

Se l'utente attiva i servizi di backup (puoi verificarlo in Settings > Google > Backup), i dati del Block Store vengono conservati durante la disinstallazione/reinstallazione dell'app.

Puoi eseguire questi passaggi per testare:

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

Dispositivo per dispositivo

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

Ripristino nel cloud

  1. Integra l'API Blockstore nella tua app di test. 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 per archiviare i dati, con shouldBackUpToCloud impostato su true.
  3. Per i dispositivi O e successivi, puoi attivare manualmente un backup nel cloud di Store Store: vai a Impostazioni > Google > backup, fai clic sul pulsante "Effettua ora il backup".
    1. Per verificare che il backup nel cloud del Store Store sia riuscito, puoi:
      1. Al termine del backup, cerca le righe del log con il tag "CloudSyncBpTkSvc".
      2. Dovresti vedere righe simili alla seguente: "......, CloudSyncBpTkSvc: sync result: SUCCESS, ..., dimensione caricata: XXX byte .....".
    2. Dopo il backup nel cloud di Block Store, viene concesso un periodo di "raffreddamento" di 5 minuti. Entro 5 minuti, il clic sul pulsante "Effettua ora il backup" non attiverà un backup nel cloud di un altro store.
  4. Ripristina i dati di fabbrica del dispositivo di destinazione e segui un flusso di ripristino del cloud. Seleziona l'opzione per ripristinare l'app di prova durante il flusso di ripristino. Per ulteriori informazioni sui flussi di ripristino del cloud, vedi Flussi di ripristino supportati dal cloud.
  5. Sul dispositivo di destinazione, usa l'app di test per richiamare l'API Blockstore per recuperare i tuoi dati.
  6. Verifica che i byte recuperati siano gli stessi 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 PIN, sequenza o password per attivare la crittografia end-to-end e criptare correttamente i dati dell'utente.

Flusso di ripristino da dispositivo a dispositivo

Per il ripristino da dispositivo a dispositivo saranno necessari un dispositivo di origine e un dispositivo di destinazione. Saranno i due dispositivi a trasferire i dati.

Per i backup, i dispositivi di origine devono eseguire Android 6 (API 23) e versioni successive.

Scegliere come target dei dispositivi con Android 9 (API 29) e versioni successive per consentire il ripristino.

Ulteriori informazioni sul flusso di ripristino da dispositivo a dispositivo sono disponibili qui.

Flusso di backup e ripristino di Cloud

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

Per i backup, i dispositivi di origine devono eseguire Android 6 (API 23) e versioni successive.

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