es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Firestore de Firebase, enviar identificador personalizado para validar acceso mediante reglas.

Mi aplicación se ve así. Tienes un propietario de una lista, el propietario puede crear y enviar un enlace de invitación a sus amigos. Estos amigos tendrán que completar un nombre de pantalla y luego se creará un documento de contribuyente de la lista que contendrá, entre otras cosas, un UID y el ID de la lista. Ahora podrán contribuir a la lista.

La idea de las reglas (en /lista) es que todos pueden crear, el propietario puede eliminar y, para escribir o actualizar, debes ser el propietario o un contribuyente de esa lista. Para lograr esto, el UID del contribuyente de la lista (no auth.) deberá enviarse con la solicitud, luego en las reglas deberá verificarse si existe un documento de contribuyente con el UID correspondiente y si el ID de la lista coincide con el ID de la lista que estás consultando.

No sé si todo esto es posible, sin embargo, realmente no quiero que los invitados tengan que iniciar sesión.

Mis reglas se ven así en este momento, ‘allow update, write’ en ‘match /lists’ es donde debe suceder.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write
      :if isSignedIn();
    }
    match /users/{userId} {
    allow create
    allow update, delete, write: if isOwner(userId);
  }
}

match /lists {
allow create
allow delete: if isOwner(resource.data.ownerId)
allow update, write
}

//functions

function isOwner(id){
        return request.auth.uid == id
  }

function isSignedIn(){
    return request.auth != null
  }
}

No sé cómo hacer que esto suceda, así que si alguien puede ayudarme, estaría genial.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para implementar la funcionalidad requerida en las reglas de seguridad de Firebase, deberás modificar las reglas en la sección “lists”. Específicamente, debes agregar una condición para verificar si el usuario está autorizado para acceder y modificar la lista.

    Las siguientes reglas deberían funcionar para tu caso de uso:

    match /lists/{listId} {
      allow create;
      allow delete: if isOwner(resource.data.ownerId);
      allow read: if true;
      allow write, update: if isOwner(resource.data.ownerId) // el propietario siempre puede modificar
                           || isContributor(listId, getUid()); // verifica si el usuario es un contribuyente de la lista
    }
    
    function isContributor(listId, uid) {
      return exists(/databases/$(database)/documents/lists/$(listId)/list_contributors/$(uid));
    }
    
    function getUid() {
      return request.resource.data.uid; // suponiendo que el uid se agrega a los datos de la solicitud
    }
    
    function isOwner(ownerId) {
      return request.auth.uid == ownerId;
    }
    

    Las reglas de seguridad anteriores permiten que el propietario cree, elimine, escriba y actualice la lista sin ninguna restricción. Sin embargo, otros usuarios solo pueden escribir y actualizar la lista si están incluidos como contribuyentes de esa lista.

    La función isContributor verifica si el usuario es un contribuyente de la lista buscando el documento correspondiente list_contributors con el uid y listId dados. Si existe dicho documento, devuelve true, permitiendo al usuario actualizar o escribir la lista.

    Ten en cuenta que las reglas asumen que el uid del contribuyente está incluido en los datos de la solicitud. Esto debe agregarse a los datos de la solicitud en el código del lado del cliente, para que pueda ser utilizado en las reglas de seguridad.

    Con estas reglas en su lugar, los usuarios pueden contribuir a la lista sin iniciar sesión, pero aún necesitan tener un enlace de invitación válido para poder hacerlo.

Comments are closed.