Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

添加函数以清除和导出用户数据

为了便于您帮助用户控制其数据,Firebase 团队创建了一个库,用于简化两种常见的用户数据处理流程:

  • clearData:当用户通过 Firebase Authentication 删除其帐号时,删除特定 Firebase 服务(目前为 Realtime Database、Firestore 和 Storage)中的用户数据。

  • exportData:将 Firebase 服务中用户数据的副本保存为一个 JSON 字符串,然后将其上传到 Cloud Storage,以便用户轻松自行下载该副本。

请继续阅读下文了解如何向您的应用添加函数,或者访问 Firebase 用户隐私 GitHub 代码库直接查看代码部分。

clearDataexportData 添加到您的应用中

该库中的 clearDataexportData 函数以 Cloud Functions 函数的形式实现,可对 Realtime Database、Cloud Storage 和 Cloud Firestore 中的数据执行操作。在您自己的应用中添加函数的过程分为三步:

  1. 修改库的 user_privacy.json 文件,以反映应用的 Realtime Database、Cloud Firestore 和 Cloud Storage 架构。
  2. clearDataexportData 部署为 Cloud Functions 函数。
  3. 针对您的应用中的函数实现触发器。
  4. 使用存储规则保护 clearData 数据。

修改库的 user_privacy.json 文件

首先,克隆或下载 Firebase 用户隐私 GitHub 代码库

完成此操作后,使用文本编辑器打开 functions/user_privacy.json。此 json 文件包含一系列可自定义的路径,clearDataexportData 函数可使用这些路径在 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"]
    ]
  },
...

如果您只想向应用中添加其中一个函数,可以删除另一个函数的对象,而不要将您的数据填入该函数中。

clearDataexportData 部署为 Cloud Functions 函数。

如果您还不熟悉 Cloud Functions,请阅读 Cloud Functions 入门指南,了解如何使用 Cloud Functions。

熟悉 Cloud Functions 之后,将 clearDataexportData 函数添加到您的项目中:

  1. 将自定义的 user_data.json 复制到 functions 目录。
  2. 将用户隐私库的 index.js 中的代码复制到项目的 index.js
    • 如果您未使用 clearData,请省略 clearDataclearDatabaseDataclearFirestoreDataclearStorageData 函数。
    • 如果您未使用 exportData,请省略 exportDataexportDatabaseDataexportFirestoreDataexportStorageData 函数。
  3. 部署您的函数。

clearDataexportData 实现触发器

各个函数都需要不同的触发器:

  • clearData:当用户通过 Authentication 删除其帐号时触发。
  • exportData:由 HTTP 请求触发。

实现 clearData 触发器

要触发 clearData 事件,您需要使用 Authentication 中的方法。如果您还没向您的应用(iOSAndroidWeb)添加 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 规则来限制对导出用户的访问权限。

  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...
  }
}