块商店

许多用户在设置新的 Android 设备时仍管理自己的凭据。这种手动流程可能会很困难,并且通常会导致用户体验不佳。Block Store API 是一个由 Google Play 服务提供支持的库,它旨在提供一种方法,让应用能够保存用户凭据,而不会产生与保存用户密码相关的复杂性或安全风险。

借助 Block Store API,您的应用可以存储用户凭据,并在以后检索这些凭据,以便在新设备上重新验证用户身份。这样有助于为用户提供更加顺畅的体验,因为他们不需要在新设备上首次启动您的应用时看到登录屏幕。

使用 Block Store 的优势包括:

  • 面向开发者的加密凭据存储解决方案。系统会尽可能对凭据进行端到端加密。
  • 请保存令牌,而不是用户名和密码。
  • 消除登录流程的不便。
  • 让用户无需再为管理复杂的密码而费心。
  • Google 会验证用户身份。

准备工作

为了让您的应用做好准备,请完成以下部分中的步骤。

配置您的应用

在您的项目级 build.gradle 文件中,同时在 buildscriptallprojects 两个部分中添加 Google's Maven 代码库

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

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

将 Block Store API 的 Google Play 服务依赖项添加到您的模块 Gradle 构建文件(通常为 app/build.gradle):

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

工作原理

块存储是一种基于令牌的登录机制,该机制以备份和恢复基础架构为基础,实现端到端加密。以下步骤概述了使用块存储的应用的工作原理:

  1. 在应用的身份验证流程中或之后的任何时间,您都可以将用户的身份验证令牌存储在 Block Store 中,以供日后检索。
  2. 令牌将存储在本地,还可以尽可能备份到云端以端到端加密。
  3. 当用户在新设备上启动恢复流程时,系统会传输数据。
  4. 如果用户在恢复流程中恢复您的应用,您的应用可以从新设备上的块存储中检索已保存的令牌。

保存令牌

当用户登录您的应用时,您可以将为该用户生成的身份验证令牌保存到 Block Store。可通过对 StoreBytesData.Builder 实例调用 setBytes() 将用户凭据存储到源设备来实现。使用 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 服务会先验证用户,然后再检索您的块存储数据。用户已同意在恢复流程中恢复您的应用数据,因此无需更多用户意见征求。当用户打开您的应用时,您可以通过调用 retrieveBytes() 从 Block Store 请求您的令牌。检索到的令牌随后可用于让用户在新设备上保持登录状态。

以下示例展示了如何检索之前使用 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)
            }
}

端到端加密

为了提供端到端加密,设备必须搭载 Android 9 或更高版本,并且用户必须为设备设置屏幕锁定(PIN 码、图案或密码)。您可以通过调用 isEndToEndEncryptionAvailable() 验证设备上是否提供加密。

以下示例展示了如何验证云备份期间是否提供加密:

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

启用云端备份

如需启用云端备份,请将 setShouldBackupToCloud() 方法添加到 StoreBytesData 对象中。当 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.")
          }
        }

测试方法

在开发过程中使用以下方法,以测试恢复流程。

同一设备卸载/重新安装

如果用户启用了 Backup Service(可在 Settings > Google > Backup 中查看),则应用卸载/重新安装后仍会保留 Block Store 数据。

您可以按照以下步骤进行测试:

  1. 将 BlockStore API 集成到测试应用。
  2. 使用测试应用调用 BlockStore API 来存储您的数据。
  3. 在同一设备上卸载您的测试应用,然后重新安装。
  4. 使用测试应用调用 BlockStore API 来检索数据。
  5. 验证检索到的字节是否与卸载之前存储的内容相同。

设备到设备

在大多数情况下,这需要将目标设备恢复出厂设置。然后,您可以进入 Android 无线恢复流程Google 线缆恢复(适用于支持的设备)。

云恢复

  1. 将 Blockstore API 集成到您的测试应用。测试应用需要提交到 Play 商店。
  2. 在源设备上,使用测试应用调用 Blockstore API 来存储您的数据,同时 shouldBackUpToCloud 设置为 true。
  3. 对于 O 及更高版本设备,您可以手动触发块存储云备份:转到 Settings > Google > Backup,点击“立即备份”按钮。
    1. 如需验证块存储云备份是否成功,您可以:
      1. 备份完成后,搜索标有“CloudSyncBpTkSvc”的日志行。
      2. 您应该会看到如下所示的行:“......、CloudSyncBpTkSvc:同步结果:SUCCESS、...、上传大小:XXX 字节 ...”
    2. 块存储云备份后,系统将有 5 分钟的“冷却”期。 在这 5 分钟内,点击“立即备份”按钮不会触发其他块存储云备份。
  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) 或更高版本。