Magasin de blocs

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

De nombreux utilisateurs gèrent toujours leurs propres identifiants lors de la configuration d'un nouvel appareil Android. Ce processus manuel peut s'avérer difficile et générer 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 des utilisateurs sans la complexité ni le risque de sécurité associés à l'enregistrement des mots de passe.

L'API Block Store permet à votre application de stocker les identifiants utilisateur qu'elle peut récupérer ultérieurement pour réauthentifier les utilisateurs sur un nouvel appareil. Cela offre une expérience plus fluide à l'utilisateur, car il n'a pas besoin de voir un écran de connexion lorsqu'il lance votre application pour la première fois sur le nouvel appareil.

L'utilisation de Block Store présente les avantages suivants:

  • Solution de stockage d'identifiants chiffrée pour les développeurs. Dans la mesure du possible, les identifiants sont chiffrés de bout en bout.
  • Enregistrez les jetons au lieu des noms d'utilisateur et des mots de passe.
  • Éliminez les obstacles liés aux processus de connexion.
  • Vous évitez aux utilisateurs de gérer des mots de passe complexes.
  • Google valide l'identité de l'utilisateur.

Avant de commencer

Pour préparer votre application, procédez comme indiqué dans les sections suivantes.

Configurer votre application

Dans le fichier build.gradle au niveau du projet, incluez le dépôt Maven de Google dans les 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 au fichier de compilation Gradle de votre module, qui est généralement app/build.gradle:

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

Comment ça marche ?

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

  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 Block Store pour le récupérer ultérieurement.
  2. Le jeton sera stocké localement et peut également être sauvegardé dans le cloud, chiffré de bout en bout si 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, celle-ci peut alors récupérer le jeton enregistré dans le Block Store 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 Block Store. 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

Ensuite, lorsqu'un utilisateur parcourt le flux 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 requis. Lorsque l'utilisateur ouvre votre application, vous pouvez demander votre jeton depuis Block Store en appelant retrieveBytes(). Le jeton récupéré peut ensuite être utilisé pour 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 qu'un chiffrement de bout en bout soit disponible, l'appareil doit être équipé d'Android 9 ou 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 pendant 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. Block Store sauvegarde régulièrement 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.")
          }
        }