塊存儲

許多用戶在設置新的 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. 驗證檢索到的字節與源設備中存儲的字節是否相同。