エンドユーザー データを消去およびエクスポートする

Firebase チームは、ユーザーが自分自身のデータを管理できるようにするために、次の 2 つの一般的なユーザーデータ処理を簡素化するライブラリを作成しました。

  • clearData: ユーザーが Firebase Authentication を通じて自分のアカウントを削除すると、特定の Firebase サービス(現時点では Realtime Database、Firestore、Storage)からそのユーザーのデータを削除します。

  • exportData: Firebase サービスからユーザーデータのコピーを JSON 文字列に保存し、Cloud Storage にアップロードします。このため、ユーザーは自分のデータを簡単にダウンロードできます。

ここでは、アプリに関数を追加する方法について説明します。また、Firebase ユーザー プライバシーに関する GitHub リポジトリでは、コードを直接参照できます。

アプリに clearData または exportData を追加する

ライブラリの clearData 関数と exportData 関数は、Realtime Database、Cloud Storage、Cloud Firestore のデータを操作する Cloud Functions として実装されています。独自のアプリにこれらの関数を追加するには、次の 4 つのステップを実行します。

  1. アプリの Realtime Database、Cloud Firestore、Cloud Storage のスキーマを反映するように、ライブラリの user_privacy.json ファイルを編集します。
  2. clearDataexportData を Cloud Functions の関数としてデプロイします。
  3. アプリの関数用のトリガーを実装します。
  4. ストレージ ルールを使用して clearData のデータを保護します。

ライブラリの user_privacy.json ファイルを編集する

まず、Firebase ユーザー プライバシーに関する GitHub リポジトリのクローンを作成するか、そのリポジトリをダウンロードします。

その作業が完了したら、テキスト エディタで functions/user_privacy.json を開きます。JSON ファイルには、カスタマイズ可能な一連のパスがあります。clearData 関数と exportData 関数はこれらのパスを使用して、Realtime Database、Cloud Firestore、Cloud Storage でアプリのデータを検出します。アプリでこれらのサービスのうちの 1 つまたは 2 つのみを使用している場合は、使用していないサービスに関連付けられている JSON オブジェクトを削除してください。

オブジェクトを削除したら、残っているサービスのプレースホルダの値を、アプリで使用する実際のデータ構造に置き換える作業を開始できます。

ユーザーデータに Realtime Database のパスを追加する

アプリの Realtime Database インスタンス用に user_privacy.json をカスタマイズするには、"database" の下にあるプレースホルダ文字列のリストを、実際のユーザーデータ パスに置き換えます。

...
  "database": {
    "clear": [
      "/users/UID_VARIABLE",    // Replace with your
      "/admins/UID_VARIABLE"    // actual RTDB paths
    ],
    "export": [
      "/users/UID_VARIABLE",    // Replace with your
      "/admins/UID_VARIABLE"    // actual RTDB paths
    ]
  },
...

これらの関数のうち 1 つのみをアプリに追加する場合は、データにそのことを入力するのではなく、他の関数のオブジェクトを削除する方法があります。

ユーザーデータが含まれる Cloud Firestore オブジェクトを追加する

アプリの Cloud Firestore インスタンス用に user_privacy.json をカスタマイズするには、"firestore" の下にあるプレースホルダ オブジェクトのリストを、ユーザーデータが含まれる実際の Cloud Firestore オブジェクトに置き換えます。

...
  "firestore": {
    "clear": [
      {"collection": "users", "doc": "UID_VARIABLE", "field": "name"},
      {"collection": "users", "doc": "UID_VARIABLE"},    // Replace with your
      {"collection": "admins", "doc": "UID_VARIABLE"}    // actual Firestore paths
    ],
    "export": [
      {"collection": "users", "doc": "UID_VARIABLE", "field": "name"},
      {"collection": "users", "doc": "UID_VARIABLE"},    // Replace with your
      {"collection": "admins", "doc": "UID_VARIABLE"}    // actual Firestore paths
    ]
  },
...

これらの関数のうち 1 つのみをアプリに追加する場合は、データにそのことを入力するのではなく、他の関数のオブジェクトを削除する方法があります。

ユーザーデータが含まれる Cloud Storage バケットおよびファイル名を追加する

アプリの Cloud Storage インスタンス用に user_privacy.json をカスタマイズするには、"storage" の下にあるプレースホルダ ストレージ バケットおよびファイル名を、実際の値に置き換えます。

...
  "storage": {
    "clear": [    // Replace with your actual storage data
      ["clear-export.appspot.com", "UID_VARIABLE/sample_data.json"],
      ["clear-exportappspot.com", "UID_VARIABLE"]
    ],
    "export": [    // Replace with your actual storage data
      ["clear-export.appspot.com", "UID_VARIABLE/sample_data.json"]
    ]
  },
...

これらの関数のうち 1 つのみをアプリに追加する場合は、データにそのことを入力するのではなく、他の関数のオブジェクトを削除する方法があります。

clearDataexportData を Cloud Functions の関数としてデプロイする

まだ Cloud Functions を使い慣れていない方は、Cloud Functions スタートガイドでその使用法をご覧ください。

Cloud Functions の関数の使用に問題がなければ、プロジェクトに clearData 関数と exportData 関数を追加します。

  1. カスタマイズした user_data.jsonfunctions ディレクトリにコピーします。
  2. ユーザー プライバシー ライブラリの index.js からプロジェクトの index.js にコードをコピーします。
    • clearData を使用していない場合は、clearDataclearDatabaseDataclearFirestoreDataclearStorageData の各関数を削除します。
    • exportData を使用していない場合は、exportDataexportDatabaseDataexportFirestoreDataexportStorageData の各関数を削除します。
  3. 関数をデプロイします。

clearDataexportData のトリガーを実装する

関数ごとに異なるトリガーが必要です。

  • clearData: ユーザーが Authentication を介して自分のアカウントを削除するとトリガーされます。
  • exportData: HTTP リクエストによってトリガーされます。

clearData トリガーを実装する

clearData イベントをトリガーするには、Authentication からメソッドを使用する必要があります。まだ用意していない場合は、アプリ(Apple プラットフォームAndroidウェブ)に Authentication を追加します。

続いて、使用するプラットフォーム用の Authentication SDK の delete メソッドを呼び出す手段を追加します。

iOS+

FirebaseAuth.User.delete { error in
  if let error = error {
    print("Error deleting user: \(error)")
  }
}

Android

FirebaseAuth.getCurrentUser().delete();

ウェブ

firebase.auth().currentUser.delete().catch(function(error) {
  if (error.code === 'auth/requires-recent-login') {
    window.alert('Please sign-in and try again.');
    firebase.auth().signOut();
  }
});

exportData トリガーを実装する

exportData トリガーを実装するには、HTTP リクエストを介して関数を呼び出すボタンまたはリンクをアプリに追加します。HTTP 経由での関数呼び出しについて詳しくは、HTTP リクエスト経由で関数を呼び出すをご覧ください。

リクエストの詳細:

  • タイプ: POST
  • URL: https://us-central1-<var>PROJECT-ID<.var>.cloudfunctions.net/exportData
  • 本文: <var>CURRENT_USER'S_UID</var>

Firebase Hosting で関数を直接呼び出す

アプリが Firebase Hosting でホストされているウェブアプリである場合は、サイトの firebase.json ファイルにある rewrite エントリを介して clearData 関数を呼び出すことができます。

  "hosting": {
    "rewrites": [
       {"source": "/exportData", "function": "exportData"}
    ]
  }

ストレージ ルールを使用して exportData のデータを保護する

ユーザーがエクスポートしたデータを限定公開のまま維持するには、エクスポートしたユーザーのみにアクセスを制限する Cloud Storage ルールを追加します。

  1. Firebase コンソールで [Storage] にアクセスします。
  2. [ルール] タブを開きます。
  3. 次のルールを貼り付け、[公開] をクリックします。
service firebase.storage {
  match /b/{bucket}/o {
    match /exportData {
      // Only allow access to the user who requested the export
      match /{uid} {
        allow read, write: if request.auth.uid == uid
      }
      match /{uid}/{path=**} {
        allow read, write: if request.auth.uid == uid
      }
    }
    // Other application rules...
  }
}