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 コンソールで [ストレージ] にアクセスします。
- [ルール] タブを開きます。
- 次のルールを貼り付け、[公開] をクリックします。
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... } }