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 つのステップを実行します。
- アプリの Realtime Database、Cloud Firestore、Cloud Storage のスキーマを反映するように、ライブラリの
user_privacy.json
ファイルを編集します。 clearData
とexportData
を Cloud Functions の関数としてデプロイします。- アプリの関数用のトリガーを実装します。
- ストレージ ルールを使用して
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 つのみをアプリに追加する場合は、データにそのことを入力するのではなく、他の関数のオブジェクトを削除する方法があります。
clearData
と exportData
を Cloud Functions の関数としてデプロイする
まだ Cloud Functions を使い慣れていない方は、Cloud Functions スタートガイドでその使用法をご覧ください。
Cloud Functions の関数の使用に問題がなければ、プロジェクトに clearData
関数と exportData
関数を追加します。
- カスタマイズした
user_data.json
をfunctions
ディレクトリにコピーします。 - ユーザー プライバシー ライブラリの
index.js
からプロジェクトのindex.js
にコードをコピーします。clearData
を使用していない場合は、clearData
、clearDatabaseData
、clearFirestoreData
、clearStorageData
の各関数を削除します。exportData
を使用していない場合は、exportData
、exportDatabaseData
、exportFirestoreData
、exportStorageData
の各関数を削除します。
- 関数をデプロイします。
clearData
と exportData
のトリガーを実装する
関数ごとに異なるトリガーが必要です。
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 ルールを追加します。
- Firebase コンソールで [Storage] にアクセスします。
- [ルール] タブを開きます。
- 次のルールを貼り付け、[公開] をクリックします。
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... } }