Negozio di blocchi

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

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 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 degli utenti.

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

L'utilizzo del Block Store offre diversi vantaggi, tra cui:

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

Prima di iniziare

Per preparare l'app, completa i passaggi indicati nelle sezioni che seguono.

Configura l'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 file build Gradle del tuo modulo, che in genere è app/build.gradle:

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

Come funziona

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

  1. Durante il flusso di autenticazione della tua app o in un secondo momento, puoi memorizzare il token di autenticazione dell'utente nel Blocca negozio per recuperarlo in un secondo momento.
  2. Il token verrà archiviato localmente e potrai anche eseguirne il backup sul 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 potrà recuperare il token salvato dal 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 averlo 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 corso...

Successivamente, quando un utente esegue il flusso di ripristino su un nuovo dispositivo, Google Play Services verifica prima l'utente, quindi recupera i tuoi dati nel Store 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 nel 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 memorizzato in precedenza nell'archivio di blocchi:

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 proprio 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")
        }

Abilita backup sul cloud

Per abilitare il backup sul cloud, aggiungi il metodo setShouldBackupToCloud() all'oggetto StoreBytesData. Il negozio di riserva eseguirà periodicamente il backup dei cloud 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

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

Disinstallazione/reinstallazione dello stesso dispositivo

Se l'utente attiva i servizi di backup (puoi controllarlo in Impostazioni > Google > Backup), i dati del Blocco Store vengono conservati per tutta la disinstallazione/reinstallazione dell'app.

Per verificarlo:

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

Dispositivo-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 in cui archiviare i dati, con shouldBackUpToCloud impostato su true.
  3. Per i dispositivi O e successivi, puoi attivare manualmente un backup sul cloud dal Blocco Store: vai a Impostazioni > Google > Backup e fai clic sul pulsante "Esegui il backup ora".
    1. Per verificare l'esito positivo del backup sul cloud del Block Store, puoi:
      1. Al termine del backup, cerca le righe di log con il tag "CloudSyncBpTkSvc".
      2. Dovresti vedere righe come: "......, CloudSyncBpTkSvc: sync result: SUCCESS, ..., dimensioni caricate: XXX byte .....".
    2. Dopo il backup sul cloud di Block Store, è previsto un periodo di "raffreddamento" di 5 minuti. Entro 5 minuti, facendo clic sul pulsante "Effettua ora il backup" non verrà attivato un altro backup sul cloud del Block Store.
  4. Ripristina i dati di fabbrica del dispositivo di destinazione e segui il flusso di ripristino del cloud. Seleziona per ripristinare l'app di test durante il flusso di ripristino. Per ulteriori informazioni sui flussi di ripristino cloud, consulta Flussi di ripristino cloud supportati.
  5. Sul dispositivo di destinazione, utilizza l'app di test per richiamare l'API Blockstore per recuperare i tuoi dati.
  6. Verifica che i byte recuperati corrispondano a quelli archiviati nel dispositivo di origine.

Requisiti del dispositivo

Crittografia end-to-end

  • La crittografia end-to-end è supportata sui dispositivi con Android 9 (API 29) e versioni successive.
  • Il dispositivo deve avere un blocco schermo impostato con un PIN, una sequenza o una password affinché la crittografia end-to-end sia attivata e i dati dell'utente vengano criptati correttamente.

Flusso di ripristino tra dispositivi

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

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

Scegli come target dispositivi con Android 9 (API 29) o versioni successive per consentire il ripristino.

Ulteriori informazioni sul flusso di ripristino dei dispositivi sono disponibili qui.

Flusso di backup e ripristino Cloud

Il backup e il ripristino sul cloud richiederanno un dispositivo di origine e un dispositivo di destinazione.

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

I dispositivi di destinazione sono supportati a seconda dei fornitori. I dispositivi Pixel possono utilizzare questa funzionalità da Android 9 (API 29), tutti gli altri dispositivi devono eseguire Android 12 (API 31) o versioni successive.