Borra y exporta datos del usuario final

Para que puedas ayudar a tus usuarios a controlar sus datos, el equipo de Firebase creó una biblioteca que simplifica dos procesos comunes de los datos del usuario:

  • clearData: borra los datos de usuario de los servicios específicos de Firebase (actualmente Realtime Database, Firestore, y Storage) cuando el usuario borra su cuenta a través de Firebase Authentication.

  • exportData: guarda una copia de los datos de usuario de los servicios de Firebase en una string JSON y la sube a Cloud Storage para que el usuario pueda descargarla fácilmente.

Sigue leyendo para descubrir cómo agregar las funciones a tu app o accede directamente al código en el repositorio de GitHub de privacidad de los usuarios de Firebase.

Agrega clearData o exportData a tu app

Las funciones clearData y exportData de la biblioteca se implementan como opciones de Cloud Functions que se aplican sobre datos de Realtime Database, Cloud Storage y Cloud Firestore. Para agregar las funciones a tu propia app, debes completar un proceso de tres pasos:

  1. Edita el archivo user_privacy.json de la biblioteca para reflejar el esquema de Realtime Database, Cloud Firestore y Cloud Storage de tu app.
  2. Implementa clearData y exportData como Cloud Functions.
  3. Aplica activadores para las funciones de tu app.
  4. Protege los datos de clearData con reglas de almacenamiento.

Edita el archivo user_privacy.json de la biblioteca

Para comenzar, clona o descarga el repositorio de GitHub de privacidad de los usuarios de Firebase.

Cuando termines, abre functions/user_privacy.json en un editor de texto. El archivo json contiene una serie de rutas de acceso personalizables que las funciones clearData y exportData usan para buscar los datos de tu app en Realtime Database, Cloud Firestore y Cloud Storage. Si tu app solo utiliza uno o dos de esos servicios, comienza por borrar los objetos JSON asociados con los servicios sin utilizar.

Sin esos objetos, puedes comenzar a reemplazar los valores que se utilizan como marcadores de posición de los servicios restantes por las estructuras de datos reales que utiliza tu app.

Agrega rutas de acceso de Realtime Database a los datos del usuario

Para personalizar user_privacy.json en la instancia de Realtime Database de tu app, reemplaza la lista de strings que se utilizan como marcadores de posición en "database" por rutas de acceso reales a los datos del usuario:

...
  "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
    ]
  },
...

Si solo deseas agregar una de las funciones a la app, puedes borrar el objeto de la otra función, en lugar de completarlo con tus datos.

Agrega objetos de Cloud Firestore que contengan datos del usuario

Para personalizar user_privacy.json en la instancia de Cloud Firestore de tu app, reemplaza la lista de objetos que se utilizan como marcadores de posición en "firestore" por objetos reales de Cloud Firestore que contengan datos del usuario:

...
  "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
    ]
  },
...

Si solo deseas agregar una de las funciones a la app, puedes borrar el objeto de la otra función, en lugar de completarlo con tus datos.

Agrega el nombre de archivo y el bucket de Cloud Storage con datos del usuario

Para personalizar user_privacy.json en la instancia de Cloud Storage de tu app, reemplaza el nombre de archivo y el bucket de almacenamiento que se utilizan como marcadores de posición en "storage" por los siguientes valores reales:

...
  "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"]
    ]
  },
...

Si solo deseas agregar una de las funciones a la app, puedes borrar el objeto de la otra función, en lugar de completarlo con tus datos.

Implementa clearData y exportData como Cloud Functions

Si todavía no conoces Cloud Functions, investiga la forma de utilizar esas funciones en la guía de introducción de Cloud Functions.

Cuando ya estés familiarizado con Cloud Functions, agrega las funciones clearData y exportData al proyecto de la siguiente manera:

  1. Copia tu user_data.json personalizado al directorio functions.
  2. Copia el código del index.js de la biblioteca de privacidad del usuario al index.js de tu proyecto.
    • Si no usas clearData, omite las funciones clearData, clearDatabaseData, clearFirestoreData y clearStorageData.
    • Si no usas exportData, omite las funciones exportData, exportDatabaseData, exportFirestoreData y exportStorageData.
  3. Implementa tus funciones.

Implementa activadores para clearData y exportData

Cada función requiere un activador diferente:

  • clearData: se activa cuando un usuario borra su cuenta mediante Authentication.
  • exportData: se activa a través de una solicitud HTTP.

Implementa un activador clearData

Para activar un evento clearData, debes utilizar un método de Authentication. Si aún no lo has hecho, agrega Authentication a tu app para plataformas de Apple, Android o web.

A continuación, agrega una forma de invocar el método delete del SDK de Authentication para tu plataforma:

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();
  }
});

Implementa un activador exportData

Para implementar un activador exportData, agrega un botón o vínculo a tu app que invoque la función mediante una solicitud HTTP. Obtén más información sobre la invocación de funciones mediante HTTP en Llama a funciones mediante solicitudes HTTP.

Detalles de la solicitud:

  • Tipo: POST
  • URL: https://us-central1-<var>PROJECT-ID<.var>.cloudfunctions.net/exportData
  • Cuerpo: <var>CURRENT_USER'S_UID</var>

Invoca la función directamente en Firebase Hosting

Si tu app es una aplicación web alojada en Firebase Hosting, puedes invocar la función clearData a través de una entrada rewrite en el archivo firebase.json del sitio:

  "hosting": {
    "rewrites": [
       {"source": "/exportData", "function": "exportData"}
    ]
  }

Protege los datos de exportData con reglas de almacenamiento

Para mantener la privacidad de los datos de usuario exportados, agrega las reglas de Cloud Storage que restringen el acceso al usuario exportador.

  1. Ve a Almacenamiento en Firebase console.
  2. Abre la pestaña Reglas.
  3. Pega la siguiente regla y, luego, haz clic en Publicar:
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...
  }
}