Блочный магазин

Многие пользователи по-прежнему управляют своими учетными данными при настройке нового устройства Android. Этот ручной процесс может стать сложным и часто приводит к плохому взаимодействию с пользователем. Block Store API, библиотека на основе сервисов Google Play , пытается решить эту проблему, предоставляя приложениям возможность сохранять учетные данные пользователя без сложности или риска для безопасности, связанного с сохранением паролей пользователей.

API Block Store позволяет вашему приложению хранить учетные данные пользователя, которые впоследствии могут быть получены для повторной аутентификации пользователей на новом устройстве. Это помогает обеспечить более удобный интерфейс для пользователя, поскольку ему не нужно видеть экран входа в систему при первом запуске вашего приложения на новом устройстве.

Преимущества использования Block Store включают следующее:

  • Зашифрованное решение для хранения учетных данных для разработчиков. Учетные данные по возможности шифруются сквозным шифрованием.
  • Сохраняйте токены вместо логинов и паролей.
  • Устраните трения в потоках входа.
  • Избавьте пользователей от бремени управления сложными паролями.
  • Google проверяет личность пользователя.

Прежде чем вы начнете

Чтобы подготовить приложение, выполните действия, описанные в следующих разделах.

Настройте свое приложение

В файле build.gradle на уровне проекта включите репозиторий Google Maven как в buildscript и в разделы allprojects :

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

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

Добавьте зависимость сервисов Google Play для API Block Store в файл сборки вашего модуля Gradle , обычно это app/build.gradle :

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

Как это устроено

Хранилище блоков — это механизм входа на основе токенов со сквозным шифрованием и надстройкой над инфраструктурой резервного копирования и восстановления. Следующие шаги описывают, как будет работать приложение, использующее Block Store:

  1. Во время процесса аутентификации вашего приложения или в любое время после этого вы можете сохранить токен аутентификации пользователя в Block Store для последующего извлечения.
  2. Токен будет храниться локально, а также может быть скопирован в облако со сквозным шифрованием, если это возможно.
  3. Данные передаются, когда пользователь инициирует процесс восстановления на новом устройстве.
  4. Если пользователь восстанавливает ваше приложение во время процесса восстановления, ваше приложение может получить сохраненный токен из Block Store на новом устройстве.

Сохранение токена

Когда пользователь входит в ваше приложение, вы можете сохранить маркер проверки подлинности, созданный для этого пользователя, в Block Store. Это делается путем вызова setBytes() экземпляра StoreBytesData.Builder для сохранения учетных данных пользователя на исходном устройстве. После сохранения токена в Block Store он шифруется и хранится локально на устройстве.

В следующем примере показано, как сохранить токен проверки подлинности на локальном устройстве:

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

Получение токена

Позже, когда пользователь проходит процесс восстановления на новом устройстве, сервисы Google Play сначала проверяют пользователя, а затем извлекают данные вашего Block Store. Пользователь уже дал согласие на восстановление данных вашего приложения в рамках процесса восстановления, поэтому дополнительные согласия не требуются. Когда пользователь открывает ваше приложение, вы можете запросить свой токен из Block Store, вызвав retrieveBytes() . Затем полученный токен можно использовать для удержания пользователя в системе на новом устройстве.

В следующем примере показано, как получить зашифрованный токен, ранее хранившийся в хранилище блоков:

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

Сквозное шифрование

Чтобы сквозное шифрование было доступно, устройство должно работать под управлением Android 9 или более поздней версии, а пользователь должен установить блокировку экрана (PIN-код, графический ключ или пароль) для своего устройства. Вы можете проверить, будет ли доступно шифрование на устройстве, вызвав isEndToEndEncryptionAvailable() .

В следующем примере показано, как проверить, будет ли доступно шифрование во время резервного копирования в облаке:

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

Включить облачное резервное копирование

Чтобы включить резервное копирование в облаке, добавьте метод setShouldBackupToCloud() в свой объект StoreBytesData . Block Store будет периодически создавать резервные копии в облаке байтов, сохраненных, если setShouldBackupToCloud() задано значение true.

В следующем примере показано, как включить облачное резервное копирование , только если облачное резервное копирование зашифровано сквозным шифрованием :

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

Как проверить

Используйте следующие методы во время разработки, чтобы протестировать потоки восстановления.

Удаление/переустановка того же устройства

Если пользователь включает службы резервного копирования (это можно проверить в разделе « Настройки» > «Google» > «Резервное копирование »), данные Block Store сохраняются при удалении/переустановке приложения.

Вы можете выполнить следующие шаги для тестирования:

  1. Интегрируйте API BlockStore в тестовое приложение.
  2. Используйте тестовое приложение, чтобы вызвать BlockStore API для хранения ваших данных.
  3. Удалите тестовое приложение, а затем переустановите его на том же устройстве.
  4. Используйте тестовое приложение, чтобы вызвать BlockStore API для извлечения ваших данных.
  5. Убедитесь, что полученные байты совпадают с теми, которые были сохранены до удаления.

Устройство к устройству

В большинстве случаев для этого потребуется сброс настроек целевого устройства до заводских. Затем вы можете войти в процесс восстановления беспроводной сети Android или восстановления кабеля Google (для поддерживаемых устройств).

Облачное восстановление

  1. Интегрируйте API Blockstore в тестовое приложение. Тестовое приложение необходимо отправить в Play Store.
  2. На исходном устройстве используйте тестовое приложение, чтобы вызвать Blockstore API для хранения ваших данных, при этом для параметра shouldBackUpToCloud установлено значение true.
  3. Для устройств O и выше вы можете вручную запустить облачное резервное копирование Block Store: перейдите в « Настройки»> «Google»> «Резервное копирование» и нажмите кнопку «Создать резервную копию сейчас».
    1. Чтобы убедиться, что резервное копирование в облачное хранилище Block Store выполнено успешно, вы можете:
      1. После завершения резервного копирования найдите строки журнала с тегом «CloudSyncBpTkSvc».
      2. Вы должны увидеть такие строки: «......, CloudSyncBpTkSvc: результат синхронизации: УСПЕШНО, ..., загруженный размер: XXX байт ...»
    2. После облачного резервного копирования Block Store наступает 5-минутный период «остывания». В течение этих 5 минут нажатие кнопки «Создать резервную копию» не вызовет еще одну резервную копию в облачном хранилище Block Store.
  4. Сбросьте целевое устройство до заводских настроек и выполните процедуру восстановления в облаке. Выберите, чтобы восстановить тестовое приложение во время процесса восстановления. Дополнительные сведения о потоках облачного восстановления см. в разделе Поддерживаемые потоки облачного восстановления .
  5. На целевом устройстве используйте тестовое приложение, чтобы вызвать Blockstore API для извлечения ваших данных.
  6. Убедитесь, что полученные байты совпадают с теми, которые были сохранены на исходном устройстве.

Требования к устройству

Сквозное шифрование

  • Сквозное шифрование поддерживается на устройствах под управлением Android 9 (API 29) и выше.
  • На устройстве должна быть установлена ​​блокировка экрана с помощью PIN-кода, графического ключа или пароля, чтобы сквозное шифрование было включено и правильно шифровало данные пользователя.

Поток восстановления с устройства на устройство

Для восстановления с устройства на устройство потребуется исходное устройство и целевое устройство. Это будут два устройства, которые передают данные.

Исходные устройства должны работать под управлением Android 6 (API 23) и выше для резервного копирования.

Целевые устройства под управлением Android 9 (API 29) и выше, чтобы иметь возможность восстановления.

Дополнительную информацию о процессе восстановления с устройства на устройство можно найти здесь .

Облачное резервное копирование и восстановление потока

Для резервного копирования и восстановления в облаке потребуются исходное и целевое устройства.

Исходные устройства должны работать под управлением Android 6 (API 23) и выше для резервного копирования.

Целевые устройства поддерживаются в зависимости от их поставщиков. Устройства Pixel могут использовать эту функцию с Android 9 (API 29), а все остальные устройства должны работать под управлением Android 12 (API 31) или более поздней версии.