Magasin de blocs

De nombreux utilisateurs gèrent toujours leurs propres identifiants lorsqu'ils configurent un nouvel appareil Android. Ce processus manuel peut s'avérer complexe et engendrer souvent une mauvaise expérience utilisateur. L'API Block Store, une bibliothèque fournie par les services Google Play, cherche à résoudre ce problème en permettant aux applications d'enregistrer les identifiants utilisateur sans la complexité ni les risques de sécurité associés à l'enregistrement des mots de passe utilisateur.

L'API Block Store permet à votre application de stocker les identifiants utilisateur qu'elle peut ensuite récupérer pour authentifier de nouveau les utilisateurs sur un nouvel appareil. L'utilisateur bénéficie ainsi d'une expérience plus fluide, car il n'a pas besoin de voir un écran de connexion lors du tout premier lancement de votre application sur le nouvel appareil.

Voici quelques-uns des avantages de la fonctionnalité Bloquer le magasin:

  • Solution de stockage d'identifiants chiffrée pour les développeurs Les identifiants sont chiffrés de bout en bout dans la mesure du possible.
  • Enregistrez les jetons au lieu des noms d'utilisateur et des mots de passe.
  • Éliminez les obstacles au processus de connexion.
  • Les utilisateurs n'ont plus à gérer les mots de passe complexes.
  • Google valide l'identité de l'utilisateur.

Avant de commencer

Pour préparer votre application, suivez les étapes décrites dans les sections suivantes.

Configurer votre application

Dans votre fichier build.gradle au niveau du projet, incluez le dépôt Maven de Google dans vos sections buildscript et allprojects:

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

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

Ajoutez la dépendance des services Google Play pour l'API Block Store à votre fichier de compilation Gradle de module, qui est généralement app/build.gradle:

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

Fonctionnement

Block Store est un mécanisme de connexion par jeton, chiffré de bout en bout et construit en plus de l'infrastructure de sauvegarde et de restauration. Les étapes suivantes décrivent le fonctionnement d'une application utilisant le blocage de magasins:

  1. Pendant le flux d'authentification de votre application ou à tout moment par la suite, vous pouvez stocker le jeton d'authentification de l'utilisateur dans le blocage du magasin pour une récupération ultérieure.
  2. Le jeton est stocké localement et peut également être sauvegardé dans le cloud, chiffré de bout en bout dans la mesure du possible.
  3. Les données sont transférées lorsque l'utilisateur lance un processus de restauration sur un nouvel appareil.
  4. Si l'utilisateur restaure votre application pendant le processus de restauration, votre application peut alors récupérer le jeton enregistré à partir du blocage du magasin sur le nouvel appareil.

Enregistrer le jeton

Lorsqu'un utilisateur se connecte à votre application, vous pouvez enregistrer le jeton d'authentification que vous générez pour cet utilisateur dans le blocage du magasin. Pour ce faire, appelez setBytes() sur une instance de StoreBytesData.Builder pour stocker les identifiants de l'utilisateur sur l'appareil source. Une fois le jeton enregistré avec Block Store, il est chiffré et stocké localement sur l'appareil.

L'exemple suivant montre comment enregistrer le jeton d'authentification sur l'appareil local:

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

Récupérer le jeton

Plus tard, lorsqu'un utilisateur parcourt la procédure de restauration sur un nouvel appareil, les services Google Play valident d'abord l'utilisateur, puis récupère vos données Block Store. L'utilisateur a déjà accepté de restaurer les données de votre application dans le cadre du processus de restauration. Aucun consentement supplémentaire n'est donc nécessaire. Lorsque l'utilisateur ouvre votre application, vous pouvez demander votre jeton depuis le Play Store en appelant retrieveBytes(). Le jeton récupéré peut ensuite servir à maintenir l'utilisateur connecté sur le nouvel appareil.

L'exemple suivant montre comment récupérer le jeton chiffré précédemment stocké avec 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)
            }
}

Chiffrement de bout en bout

Pour que le chiffrement de bout en bout soit disponible, l'appareil doit exécuter Android 9 ou une version ultérieure, et l'utilisateur doit avoir défini un verrouillage de l'écran (code, schéma ou mot de passe) pour son appareil. Vous pouvez vérifier si le chiffrement sera disponible sur l'appareil en appelant isEndToEndEncryptionAvailable().

L'exemple suivant montre comment vérifier si le chiffrement sera disponible lors de la sauvegarde dans le cloud:

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

Activer la sauvegarde dans le cloud

Pour activer la sauvegarde dans le cloud, ajoutez la méthode setShouldBackupToCloud() à votre objet StoreBytesData. Le magasin de blocs sera régulièrement sauvegardé dans le cloud pour stocker dans le cloud les octets stockés lorsque setShouldBackupToCloud() est défini sur"true".

L'exemple suivant montre comment activer la sauvegarde dans le cloud uniquement lorsque la sauvegarde dans le cloud est chiffrée de bout en bout:

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

Tests

Lors du développement, utilisez les méthodes suivantes pour tester les flux de restauration.

Désinstaller/Réinstaller sur le même appareil

Si l'utilisateur active les services de sauvegarde (vous pouvez les vérifier dans Paramètres > Google > Sauvegarde), les données du magasin de blocages sont conservées pendant la désinstallation et la réinstallation de l'application.

Pour cela, procédez comme suit:

  1. Intégrez l'API BlockStore dans votre application test.
  2. Appelez l'API BlockStore pour stocker vos données à l'aide de l'application de test.
  3. Désinstallez votre application de test, puis réinstallez-la sur le même appareil.
  4. Utilisez l'application de test pour appeler l'API BlockStore afin de récupérer vos données.
  5. Vérifiez que les octets récupérés sont les mêmes que ceux stockés avant la désinstallation.

Appareil à appareil

Dans la plupart des cas, vous devrez rétablir la configuration d'usine de l'appareil cible. Vous pouvez ensuite accéder au flux de restauration sans fil Android ou à la récupération des câbles Google (pour les appareils compatibles).

Restauration dans le cloud

  1. Intégrez l'API Blockstore dans votre application test. Cette application doit être envoyée au Play Store.
  2. Sur l'appareil source, utilisez l'application de test pour appeler l'API Blockstore afin de stocker vos données, avec le paramètre mustBackUpToCloud défini sur "true".
  3. Pour les appareils O et versions ultérieures, vous pouvez déclencher manuellement une sauvegarde dans le cloud sur le magasin de blocage : accédez à Paramètres > Google > Sauvegarde, puis au bouton "Sauvegarder maintenant".
    1. Pour vérifier que la sauvegarde dans le cloud du magasin a bien été effectuée, vous pouvez :
      1. Une fois la sauvegarde terminée, recherchez les lignes de journal ayant le tag "CloudSyncBpTkSvc".
      2. Les lignes qui doivent s'afficher doivent ressembler à ceci : "......, CloudSyncBpTkSvc: sync result: SUCCESS, ..., uploaded size: XXX bytes ......"
    2. Après une sauvegarde dans le cloud, vous devrez patienter cinq minutes lorsque l'option d'attente est utilisée. Dans les cinq minutes suivant, le bouton "Sauvegarder" ne déclenchera pas d'autre sauvegarde dans le cloud du magasin.
  4. Rétablissez la configuration d'usine de l'appareil cible et suivez une procédure de restauration dans le cloud. Sélectionnez cette option pour restaurer votre application de test lors du processus de restauration. Pour en savoir plus sur les flux de restauration dans le cloud, consultez la section Flux de restauration du cloud compatibles.
  5. Sur l'appareil cible, utilisez l'application de test pour appeler l'API Blockstore afin de récupérer vos données.
  6. Vérifiez que les octets récupérés sont identiques à ceux stockés dans l'appareil source.

Configuration requise pour l'appareil

Chiffrement de bout en bout

  • Le chiffrement de bout en bout est possible sur les appareils équipés d'Android 9 (API 29) ou d'une version ultérieure.
  • Le verrouillage de l'écran doit être défini avec un code, un schéma ou un mot de passe pour que le chiffrement de bout en bout puisse être activé et que les données de l'utilisateur soient correctement chiffrées.

Flux de restauration appareil à appareil

Pour restaurer les appareils, vous devez disposer d'un appareil source et d'un appareil cible. Il s'agit des deux appareils qui transfèrent les données.

Les appareils source doivent fonctionner sous Android 6 (API 23) ou une version ultérieure pour la sauvegarde.

Ciblez les appareils équipés d'Android 9 (API 29) ou d'une version ultérieure pour avoir la possibilité d'effectuer une restauration.

Pour en savoir plus sur le processus de restauration de l'appareil, cliquez ici.

Flux de sauvegarde et de restauration dans le cloud

La sauvegarde et la restauration dans le cloud nécessitent un appareil source et un appareil cible.

Les appareils source doivent fonctionner sous Android 6 (API 23) ou une version ultérieure pour la sauvegarde.

Les appareils cibles sont acceptés en fonction de leur fournisseur. Les appareils Pixel peuvent utiliser cette fonctionnalité depuis Android 9 (API 29) et tous les autres appareils doivent être équipés d'Android 12 (API 31) ou version ultérieure.