许多用户在设置新的 Android 设备时仍会管理自己的凭据。手动流程可能会很困难,并且通常会导致糟糕的用户体验。Block Store API 是由 Google Play 服务提供支持的库,旨在解决此问题,让应用能够保存用户凭据,而不会带来与保存用户密码相关的复杂性或安全风险。
借助 Block Store API,您的应用可以存储用户凭据,然后在以后在新设备上重新对这些用户凭据进行身份验证。这有助于为用户提供更顺畅的体验,因为他们在新设备上首次启动应用时不需要看到登录屏幕。
使用 Block Store 的优势包括:
- 面向开发者的加密凭据存储解决方案。凭据会尽可能进行端到端加密。
- 保存令牌,而不是用户名和密码。
- 消除登录流程的阻碍因素。
- 让用户无需管理复杂的密码,从而减轻负担。
- Google 会验证用户身份。
准备工作
为了让您的应用做好准备,请完成以下部分中的步骤。
配置您的应用
在您的项目级 build.gradle
文件中,同时在 buildscript
和 allprojects
两个部分中添加 Google 的 Maven 代码库:
buildscript {
repositories {
google()
mavenCentral()
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
将 Block Store API 的 Google Play 服务依赖项添加到模块的 Gradle build 文件(通常为 app/build.gradle
)中:
dependencies {
implementation 'com.google.android.gms:play-services-auth-blockstore:16.1.0'
}
工作原理
块存储是一种基于令牌的登录机制,该机制以备份和恢复基础架构为基础,经过端到端加密。以下步骤概述了利用块存储的应用将如何工作:
- 在应用的身份验证流程中或之后的任何时间,您都可以将用户的身份验证令牌存储在 Block Store 中,以便日后检索。
- 该令牌将存储在本地,还可以尽可能备份到云端进行端到端加密。
- 当用户在新设备上启动恢复流程时,系统会传输数据。
- 如果用户在恢复流程中恢复了您的应用,那么您的应用可以从新设备上的块存储中检索已保存的令牌。
保存令牌
当用户登录您的应用时,您可以将您为该用户生成的身份验证令牌保存到“块存储”。为此,请在 StoreBytesData.Builder
实例上调用 setBytes()
,以将用户的凭据存储到源设备中。使用“块存储”保存令牌后,令牌会加密并存储在设备本地。
以下示例展示了如何将身份验证令牌保存到本地设备:
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 存储的加密令牌:
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.")
}
}
测试方法
在开发过程中使用以下方法测试恢复流程。
同一设备卸载/重新安装
如果用户启用了备份服务(可依次转到设置 > Google > 备份,则应用卸载/重新安装块存储数据会保留下来)。
您可以按照以下步骤进行测试:
- 将 BlockStore API 集成到您的测试应用。
- 使用测试应用调用 BlockStore API 来存储您的数据。
- 卸载测试应用,然后在同一设备上重新安装您的应用。
- 使用测试应用调用 BlockStore API 来检索您的数据。
- 验证检索的字节是否与卸载之前存储的文件相同。
设备到设备
在大多数情况下,这需要将目标设备恢复出厂设置。然后,您可以进入 Android 无线恢复流程或 Google 数据线恢复(针对支持的设备)。
云端恢复
- 将 Blockstore API 集成到您的测试应用。您需要将测试应用提交到 Play 商店。
- 在源设备上,使用测试应用调用 Blockstore API 以存储您的数据,并将 shouldBackUpToCloud 设为 true。
- 对于搭载 Android O 及更高版本的设备,您可以手动触发 Block Store 云备份:前往设置 > Google > 备份,点击“立即备份”按钮。
- 如需验证“块存储”云备份是否成功,您可以:
- 备份完成后,搜索标有“CloudSyncBpTkSvc”的日志行。
- 您应该会看到如下所示的行:“......、CloudSyncBpTkSvc: sync result: SUCCESS, ..., uploaded size: XXX bytes ...”
- 块存储云备份之后,会有一个 5 分钟的“冷却”期。 在 5 分钟内,点击“立即备份”按钮不会触发另一个块存储云备份。
- 如需验证“块存储”云备份是否成功,您可以:
- 将目标设备恢复出厂设置,并完成云端恢复流程。选择在恢复流程中恢复您的测试应用。如需详细了解云端恢复流程,请参阅支持的云端恢复流程。
- 在目标设备上,使用测试应用调用 Blockstore API 来检索您的数据。
- 验证检索到的字节是否与源设备中存储的字节相同。
设备要求
端到端加密
- 搭载 Android 9 (API 29) 及更高版本的设备支持端到端加密。
- 设备必须设置屏幕锁定,并设置 PIN 码、图案或密码,才能启用端到端加密并正确加密用户数据。
设备到设备恢复流程
设备到设备恢复将要求您拥有源设备和目标设备。这两个设备将会传输数据。
源设备必须搭载 Android 6 (API 23) 及更高版本才能备份。
目标为搭载 Android 9 (API 29) 及更高版本的设备,以便能够恢复设备。
如需详细了解设备到设备恢复流程,请点击此处。
Cloud 备份和恢复流程
云端备份和恢复功能需要源设备和目标设备,
源设备必须搭载 Android 6 (API 23) 及更高版本才能备份。
支持的目标设备取决于其供应商。Pixel 设备可以从 Android 9 (API 29) 开始使用此功能,所有其他设备都必须搭载 Android 12 (API 31) 或更高版本。