块存储

许多用户在设置新的 Android 设备时仍然管理自己的凭据。此手动过程可能会变得具有挑战性,并且通常会导致糟糕的用户体验。 Block Store API 是一个由Google Play 服务提供支持的库,它希望通过为应用程序提供一种保存用户凭据的方法来解决这个问题,而不会产生与保存用户密码相关的复杂性或安全风险。

Block Store API 允许您的应用程序存储用户凭据,以后可以检索这些凭据以重新验证新设备上的用户。这有助于为用户提供更无缝的体验,因为他们在新设备上首次启动您的应用时不需要看到登录屏幕。

使用 Block Store 的好处包括:

  • 面向开发人员的加密凭证存储解决方案。如果可能,凭证会进行端到端加密。
  • 保存令牌而不是用户名和密码。
  • 消除登录流程中的摩擦。
  • 使用户免于管理复杂密码的负担。
  • Google 会验证用户的身份。

在你开始之前

要准备您的应用程序,请完成以下部分中的步骤。

配置您的应用

在您的项目级build.gradle文件中,在您的buildscriptallprojects部分中包含Google 的 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'
}

怎么运行的

块存储是一种基于令牌的登录机制,它是端到端加密的,并建立在备份和恢复基础架构之上。以下步骤概述了使用 Block Store 的应用程序如何工作:

  1. 在您的应用程序的身份验证流程期间或之后的任何时间,您可以将用户的身份验证令牌存储到 Block Store 以供以后检索。
  2. 令牌将存储在本地,也可以备份到云端,并在可能的情况下进行端到端加密。
  3. 当用户在新设备上启动恢复流程时会传输数据。
  4. 如果用户在恢复流程中恢复了您的应用程序,您的应用程序就可以从新设备上的 Block Store 中检索保存的令牌。

保存令牌

当用户登录您的应用程序时,您可以将您为该用户生成的身份验证令牌保存到 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.getBytesStored()}")
        }
        .addOnFailureListener { e ->
            Log.e(TAG, “Failed to store bytes”, e)
        }

检索令牌

稍后,当用户在新设备上完成恢复流程时,Google Play 服务首先验证用户,然后检索您的 Block Store 数据。作为恢复流程的一部分,用户已经同意恢复您的应用数据,因此不需要额外的同意。当用户打开您的应用程序时,您可以通过调用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 */)
        .build()
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.")
          }
        }

如何测试

在开发过程中使用以下方法来测试还原流程。

相同的设备卸载/重新安装

如果用户启用了备份服务(可以在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及以上设备,您可以手动触发Block Store云备份:进入设置>谷歌>备份,点击“立即备份”按钮。
    1. 要验证 Block Store 云备份是否成功,您可以:
      1. 备份完成后,搜索带有“CloudSyncBpTkSvc”标签的日志行。
      2. 你应该看到这样的行:“......,CloudSyncBpTkSvc:同步结果:成功,......,上传大小:XXX字节......”
    2. 在 Block Store 云备份之后,有一个 5 分钟的“冷却”期。在这 5 分钟内,单击“立即备份”按钮不会触发另一个 Block Store 云备份。
  4. 恢复出厂设置目标设备并完成云恢复流程。选择在恢复流程中恢复您的测试应用程序。有关云还原流程的更多信息,请参阅支持的云还原流程
  5. 在目标设备上,使用测试应用调用 Blockstore API 来检索您的数据。
  6. 验证检索到的字节与源设备中存储的字节是否相同。