ブロックストア

多くのユーザーは、新しいAndroidデバイスをセットアップするときに、引き続き自分の資格情報を管理します。この手動プロセスは困難になる可能性があり、多くの場合、ユーザーエクスペリエンスが低下します。ブロックストアAPI、ライブラリによって供給Google Playのサービス、アプリはユーザーのパスワードの保存に関連した複雑さやセキュリティリスクなしにユーザーの資格情報を保存するための方法を提供することで、これを解決するルックス。

Block Store APIを使用すると、アプリはユーザークレデンシャルを保存できます。このクレデンシャルは、後で取得して、新しいデバイスでユーザーを再認証できます。これにより、ユーザーは新しいデバイスでアプリを初めて起動するときにサインイン画面を表示する必要がないため、よりシームレスなエクスペリエンスを提供できます。

ブロックストアを使用する利点は次のとおりです。

  • 開発者向けの暗号化されたクレデンシャルストレージソリューション。クレデンシャルは、可能な場合はエンドツーエンドで暗号化されます。
  • ユーザー名とパスワードの代わりにトークンを保存します。
  • サインインフローからの摩擦を排除します。
  • 複雑なパスワードを管理する負担からユーザーを救います。
  • Googleはユーザーの身元を確認します。

あなたが始める前に

アプリを準備するには、次のセクションの手順を完了します。

アプリを構成する

プロジェクト・レベルの中build.gradleファイルが含まれるGoogleのMavenのリポジトリを、あなたの両方にbuildscriptallprojectsセクション:

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

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

追加Google PlayのサービスのごにブロックストアAPIの依存関係をモジュールのGradleのビルドファイル一般的で、 app/build.gradle

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

使い方

ブロックストアは、エンドツーエンドで暗号化され、バックアップと復元のインフラストラクチャ上に構築されたトークンベースのサインインメカニズムです。次の手順は、BlockStoreを利用するアプリがどのように機能するかを示しています。

  1. アプリの認証フロー中、またはその後いつでも、ユーザーの認証トークンをブロックストアに保存して後で取得できます。
  2. トークンはローカルに保存され、可能な場合はエンドツーエンドで暗号化してクラウドにバックアップすることもできます。
  3. ユーザーが新しいデバイスで復元フローを開始すると、データが転送されます。
  4. ユーザーが復元フロー中にアプリを復元すると、アプリは新しいデバイスのブロックストアから保存されたトークンを取得できます。

トークンを保存する

ユーザーがアプリにサインインすると、そのユーザー用に生成した認証トークンをブロックストアに保存できます。これは、呼び出しによって行われますsetBytes()のインスタンス上StoreBytesData.Builderソースデバイスにユーザーの資格情報を格納します。ブロックストアでトークンを保存すると、トークンは暗号化され、デバイスにローカルに保存されます。

次のサンプルは、認証トークンをローカルデバイスに保存する方法を示しています。

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サービスは最初にユーザーを確認し、次にブロックストアデータを取得します。ユーザーは、復元フローの一部としてアプリデータを復元することにすでに同意しているため、追加の同意は必要ありません。ユーザーがアプリを開くと、あなたが呼び出すことによってブロックStoreからあなたのトークンを要求することができretrieveBytes()取得したトークンを使用して、ユーザーを新しいデバイスにサインインさせたままにすることができます。

次のサンプルは、以前にBlockStoreで保存された暗号化されたトークンを取得する方法を示しています。

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()真として設定されているが。

クラウドバックアップは、エンドツーエンドの暗号化されている場合にのみ、クラウドバックアップを有効にする方法を次のサンプルで示しています

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

テストする方法

復元フローをテストするには、開発中に次の方法を使用します。

同じデバイスのアンインストール/再インストール

ユーザーがバックアップサービスを有効にした場合(それが設定]> [Google]> [バックアップ時に確認することができます)、ブロックストアのデータは、アプリのアンインストール/再インストール間で保持されます。

次の手順に従ってテストできます。

  1. BlockStoreAPIをテストアプリに統合します。
  2. テストアプリを使用してBlockStoreAPIを呼び出し、データを保存します。
  3. テストアプリをアンインストールしてから、同じデバイスにアプリを再インストールします。
  4. テストアプリを使用してBlockStoreAPIを呼び出し、データを取得します。
  5. 取得されたバイトが、アンインストール前に保存されたものと同じであることを確認します。

デバイス間

ほとんどの場合、これにはターゲットデバイスの工場出荷時のリセットが必要になります。その後、入力することができますAndroidの無線が流れを復元するか、 Googleのケーブルが復元(サポートされているデバイスのため)。

クラウドの復元

  1. BlockstoreAPIをテストアプリに統合します。テストアプリはPlayストアに送信する必要があります。
  2. ソースデバイスで、テストアプリを使用してBlockstore APIを呼び出し、shouldBackUpToCloudをtrueに設定してデータを保存します。
  3. Oの場合やデバイス上で、手動でブロックストアクラウドバックアップをトリガーすることができます:ボタン「今すぐバックアップ」をクリックし、設定]> [Google]> [バックアップに進みます。
    1. ブロックストアクラウドバックアップが成功したことを確認するには、次のことができます。
      1. バックアップが終了したら、「CloudSyncBpTkSvc」というタグが付いたログ行を検索します。
      2. 次のような行が表示されます:「......、CloudSyncBpTkSvc:同期結果:SUCCESS、...、アップロードされたサイズ:XXXバイト...」
    2. ブロックストアクラウドバックアップの後、5分間の「クールダウン」期間があります。その5分以内に、[今すぐバックアップ]ボタンをクリックしても、別のBlockStoreクラウドバックアップはトリガーされません。
  4. ターゲットデバイスを工場出荷時にリセットし、クラウド復元フローを実行します。復元フロー中にテストアプリを復元する場合に選択します。クラウドの詳細についてはフローを復元し、参照サポートされている雲は流れを復元します
  5. ターゲットデバイスで、テストアプリを使用してBlockstore APIを呼び出し、データを取得します。
  6. 取得されたバイトがソースデバイスに保存されたものと同じであることを確認します。