Loja de blocos

Muitos usuários ainda gerenciam as próprias credenciais ao configurar um novo dispositivo Android. Esse processo manual pode se tornar desafiador e, geralmente, resultar em uma experiência ruim para o usuário. A API Block Store, uma biblioteca com a tecnologia do Google Play Services, procura resolver isso fornecendo uma maneira de os apps salvarem as credenciais de usuário sem a complexidade ou o risco de segurança associado ao salvamento de senhas de usuário.

A API Block Store permite que o app armazene credenciais de usuário que podem ser recuperadas para autenticar novamente os usuários em um novo dispositivo. Isso ajuda a fornecer uma experiência mais simples para o usuário, já que ele não precisa ver uma tela de login ao iniciar o app pela primeira vez no novo dispositivo.

Veja os benefícios de usar a Block Store:

  • Solução de armazenamento de credenciais criptografada para desenvolvedores. As credenciais são criptografadas de ponta a ponta quando possível.
  • Salve tokens em vez de nomes de usuário e senhas.
  • Eliminar os atritos nos fluxos de login
  • Simplifique o gerenciamento de senhas complexas para os usuários.
  • O Google verifica a identidade do usuário.

Antes de começar

Para preparar o app, siga as etapas nas seções a seguir.

Configurar o app

No arquivo build.gradle do projeto, inclua o repositório Maven do Google nas seções buildscript e allprojects:

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

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

Adicione a dependência do Google Play Services para a API Block Store ao arquivo de build do Gradle do seu módulo, que geralmente é app/build.gradle:

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

Como funciona

O armazenamento em blocos é um mecanismo de login baseado em token que é criptografado de ponta a ponta e baseado na infraestrutura de backup e restauração. As etapas a seguir descrevem como um app que usa o Block Store funciona:

  1. Durante o fluxo de autenticação do app ou a qualquer momento depois disso, é possível armazenar o token de autenticação do usuário no Block Store para recuperação posterior.
  2. O token será armazenado localmente e também poderá ser armazenado em backup na nuvem, criptografado de ponta a ponta quando possível.
  3. Os dados são transferidos quando o usuário inicia um fluxo de restauração em um novo dispositivo.
  4. Se o usuário restaurar o app durante o fluxo de restauração, ele poderá recuperar o token salvo do Block Store no novo dispositivo.

Como salvar o token

Quando um usuário faz login no app, você pode salvar o token de autenticação gerado para ele no Block Store. Para fazer isso, chame setBytes() em uma instância do StoreBytesData.Builder para armazenar as credenciais do usuário no dispositivo de origem. Depois de salvar o token com o Block Store, ele é criptografado e armazenado localmente no dispositivo.

Veja na amostra a seguir como salvar o token de autenticação no dispositivo 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)
        }

Como recuperar o token

Mais tarde, quando um usuário passa pelo fluxo de restauração em um novo dispositivo, o Google Play Services primeiro verifica o usuário e, em seguida, recupera os dados da Block Store. O usuário já concordou em restaurar os dados do app como parte do fluxo de restauração. Portanto, não é necessário consentimentos adicionais. Quando o usuário abre o app, você pode solicitar o token do Block Store chamando retrieveBytes(). O token recuperado poderá ser usado para manter o usuário conectado no novo dispositivo.

Veja na amostra a seguir como recuperar o token criptografado que foi armazenado anteriormente com o 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)
            }
}

Criptografia de ponta a ponta

Para que a criptografia de ponta a ponta seja disponibilizada, o dispositivo precisa ter o Android 9 ou uma versão mais recente e o usuário precisa ter definido um bloqueio de tela (PIN, padrão ou senha) para o dispositivo. Você pode verificar se a criptografia estará disponível no dispositivo chamando isEndToEndEncryptionAvailable().

O exemplo a seguir mostra como verificar se a criptografia estará disponível durante o backup na nuvem:

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

Ativar backup em nuvem

Para ativar o backup na nuvem, adicione o método setShouldBackupToCloud() ao objeto StoreBytesData. O Block Store fará backup periodicamente dos bytes armazenados na nuvem quando setShouldBackupToCloud() for definido como verdadeiro.

O exemplo a seguir mostra como ativar o backup na nuvem somente quando ele é criptografado de ponta a ponta:

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

Como testar

Use os métodos a seguir durante o desenvolvimento para testar os fluxos de restauração.

Mesmo desinstalação/reinstalação do mesmo dispositivo

Se o usuário ativar os serviços de backup (é possível verificar isso em Configurações > Google > Backup), os dados da Block Store vão ser mantidos em todo o processo de desinstalação/reinstalação do app.

Siga estas etapas para testar:

  1. Integre a API BlockStore ao app de teste.
  2. Use o app de teste para invocar a API BlockStore para armazenar seus dados.
  3. Desinstale e reinstale o app de teste no mesmo dispositivo.
  4. Use o app de teste para invocar a API BlockStore e recuperar os dados.
  5. Verifique se os bytes recuperados são os mesmos que foram armazenados antes da desinstalação.

De dispositivo para dispositivo

Na maioria dos casos, será preciso redefinir o dispositivo de destino para a configuração original. Em seguida, insira o fluxo de restauração sem fio do Android ou a restauração de cabos do Google (para dispositivos compatíveis).

Restauração em nuvem

  1. Integre a API Blockstore ao app de teste. O app de teste precisa ser enviado à Play Store.
  2. No dispositivo de origem, use o app de teste para invocar a API Blockstore para armazenar seus dados, com o "backBackUpToCloud" definido como "true".
  3. Para dispositivos com O e mais recentes, é possível acionar manualmente um backup em nuvem da Block Store: acesse Configurações > Google > Backup e clique no botão “Fazer backup agora”.
    1. Para verificar se o backup na nuvem do Block Store foi concluído, faça o seguinte:
      1. Após a conclusão do backup, procure linhas de registro com a tag "CloudSyncBpTkSvc".
      2. Você verá linhas como “......, CloudSyncBpTkSvc: sync result: result SUCCESS, ..., uploaded size: XXX bytes ...”
    2. Depois de um backup na nuvem do Block Store, há um período de cinco minutos. Nesse período, clicar no botão "Fazer backup agora" não acionará outro backup na nuvem do Block Store.
  4. Redefina o dispositivo de destino para a configuração original e siga um fluxo de restauração da nuvem. Selecione para restaurar o app de teste durante o fluxo de restauração. Para mais informações sobre fluxos de restauração na nuvem, consulte Fluxos de restauração na nuvem compatíveis.
  5. No dispositivo de destino, use o app de teste para invocar a API Blockstore e recuperar os dados.
  6. Verifique se os bytes recuperados são os mesmos que foram armazenados no dispositivo de origem.

Requisitos do dispositivo

Criptografia de ponta a ponta

  • A criptografia de ponta a ponta é compatível com dispositivos que executam o Android 9 (API 29) e versões mais recentes.
  • O dispositivo precisa ter um bloqueio de tela definido com um PIN, um padrão ou uma senha para ativar a criptografia de ponta a ponta e criptografar corretamente os dados do usuário.

Fluxo de restauração de dispositivos para dispositivos

Para restaurar dispositivos automaticamente, você precisa ter um dispositivo de origem e outro de destino. Esses vão ser os dois dispositivos que estão transferindo dados.

Os dispositivos de origem precisam ter o Android 6 (API 23) ou versão mais recente para fazer backup.

Segmente dispositivos com o Android 9 (API 29) ou versões mais recentes para conseguir fazer a restauração.

Veja mais informações sobre o fluxo de restauração de cada dispositivo aqui.

Fluxo de backup e restauração do Cloud

O backup e a restauração do Cloud exigirão um dispositivo de origem e outro de destino.

Os dispositivos de origem precisam ter o Android 6 (API 23) ou versão mais recente para fazer backup.

Os dispositivos de destino são compatíveis com base nos fornecedores. Os dispositivos Pixel podem usar esse recurso pelo Android 9 (API 29) e todos os outros dispositivos precisam ter o Android 12 (API 31) ou versões mais recentes.