为了便于您帮助用户控制其数据,Firebase 团队创建了一个库,用于简化两种常见的用户数据处理流程:
clearData
:在用户通过 Firebase 身份验证删除其帐号时,从特定 Firebase 服务(目前为实时数据库、Firestore 和 Storage)中删除用户的数据。exportData
:将 Firebase 服务中的用户数据副本保存为 JSON 字符串,并将其上传到 Cloud Storage,以便用户轻松自行下载该副本。
您可以继续阅读以了解如何向您的应用添加函数,也可以访问 Firebase 用户隐私 GitHub 代码库直接查看代码部分。
向您的应用添加 clearData
或 exportData
该库中的 clearData
和 exportData
函数以 Cloud Functions 的形式实现,可对实时数据库、Cloud Storage 和 Cloud Firestore 中的数据执行操作。在您自己的应用中添加函数的过程分为三步:
- 修改该库的
user_privacy.json
文件,以反映您应用的实时数据库、Cloud Firestore 和 Cloud Storage 架构。 - 将
clearData
和exportData
作为 Cloud Functions 部署。 - 在您的应用中实现针对函数的触发器。
- 使用存储规则保障
clearData
数据的安全。
修改该库的 user_privacy.json
文件
首先,克隆或下载 Firebase 用户隐私 GitHub 代码库。
完成此操作后,在文本编辑器中打开 functions/user_privacy.json
。json 文件包含一系列可自定义的路径,clearData
和 exportData
函数可使用这些路径在实时数据库、Cloud Firestore 和 Cloud Storage 中查找您应用的数据。如果您的应用只使用其中的一项或两项服务,请先删除与未使用的服务关联的 JSON 对象。
这些对象被删除后,您就可以开始将剩余服务的占位值替换为您的应用使用的实际数据结构。
向用户数据中添加实时数据库路径
要为应用的实时数据库实例自定义 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 ] }, ...
如果您只想向应用中添加其中一个函数,可以删除另一个函数的对象,而不要将您的数据填入该函数中。
添加包含用户数据的 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 ] }, ...
如果您只想向应用中添加其中一个函数,可以删除另一个函数的对象,而不要将您的数据填入该函数中。
将 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"] ] }, ...
如果您只想向应用中添加其中一个函数,可以删除另一个函数的对象,而不要将您的数据填入该函数中。
将 clearData
和 exportData
作为 Cloud Functions 部署
如果您还不熟悉 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
:当用户通过身份验证删除其帐号时触发。exportData
:由 HTTP 请求触发。
实现 clearData
触发器
要触发 clearData
事件,您需要使用身份验证中的方法。如果您还没有使用,请向您的应用(iOS、Android 或网页)添加身份验证。
然后,添加一种方法来为您的平台调用 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
- 网址:
https://us-central1-<var>PROJECT-ID<.var>.cloudfunctions.net/exportData
- 正文:
<var>CURRENT_USER'S_UID</var>
直接在 Firebase 托管中调用函数
如果您的应用是托管在 Firebase 托管上的网页应用,您可以通过网站的 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... } }