为了便于您帮助用户控制其数据,Firebase 团队创建了一个库,用于简化两种常见的用户数据处理流程:
clearData
:当用户通过 Firebase Authentication 删除其账号时,删除特定 Firebase 服务(目前为 Realtime Database、Firestore 和 Storage)中的用户数据。exportData
:将 Firebase 服务中用户数据的副本保存为一个 JSON 字符串,然后将其上传到 Cloud Storage,以便用户轻松自行下载该副本。
请继续阅读下文了解如何向您的应用添加函数,或者访问 Firebase 用户隐私 GitHub 代码库直接查看代码部分。
将 clearData
或 exportData
添加到您的应用中
该库中的 clearData
和 exportData
函数以 Cloud Functions 的形式实现,可对 Realtime Database、Cloud Storage 和 Cloud Firestore 中的数据执行操作。在您自己的应用中添加函数的过程分为三步:
- 修改库的
user_privacy.json
文件,以反映应用的 Realtime Database、Cloud Firestore 和 Cloud Storage 架构。 - 将
clearData
和exportData
作为 Cloud Functions 部署。 - 针对您的应用中的函数实现触发器。
- 使用存储规则保护
clearData
数据。
修改库的 user_privacy.json
文件
首先,克隆或下载 Firebase 用户隐私 GitHub 代码库。
完成此操作后,使用文本编辑器打开 functions/user_privacy.json
。此 json 文件包含一系列可自定义的路径,clearData
和 exportData
函数可使用这些路径在 Realtime Database、Cloud Firestore 和 Cloud Storage 中查找您应用的数据。如果您的应用只使用其中的一项或两项服务,请先删除与未使用的服务关联的 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 ] }, ...
如果您只想向应用中添加其中一个函数,可以删除另一个函数的对象,而不要将您的数据填入该函数中。
添加包含用户数据的 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 之后,将 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 或 Web)添加 Authentication,请先执行此操作。
然后,添加一种方法来调用适用于您的平台的 Authentication SDK 的 delete
方法:
iOS+
FirebaseAuth.User.delete { error in
if let error = error {
print("Error deleting user: \(error)")
}
}
Android
FirebaseAuth.getCurrentUser().delete();
Web
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 Hosting 中调用函数
如果您的应用是 Firebase Hosting 托管的 Web 应用,可以通过网站的 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... } }