Estoy creando una aplicación con Firebase y uso el SDK de Javascript del lado del cliente para acceder a los datos de Firestore. Me encuentro con un problema: con mis reglas de Firestore, si un documento no se puede leer, no hay forma de determinar por qué no se pudo leer. Cualquier falla de las reglas para permitir que el documento se lea produce el mismo PERMISSION_DENIED: Missing or insufficient permissions
.
Sin una forma de determinar por qué se denegó el acceso, no puedo presentar la forma correcta de obtener acceso al recurso en la interfaz de usuario, o decir qué salió mal (por ejemplo, debe iniciar sesión para usar este complemento, o debe comprar una suscripción para trabajar este widget) Viniendo de un fondo de nodo, he escrito una gran cantidad de código utilizando códigos de respuesta http como este (pseudocódigo):
if (!doc) { // present a 'not found' message to the user return {status: 404} } else if (!req.user) { // present a log in/sign up dialog return {status: 401} } else if (req.user !== doc.owner) { // present a no-access message return {status: 403} } else { return {status: 200: body: doc} }
Aparte de escribir una capa del lado del servidor para manejar los permisos en lugar de usar firestore.rules, o crear una colección separada solo para manejar los permisos, que tendrían que mantenerse sincronizados manualmente y requerir el doble de lecturas, ¿hay alguna manera de escribir el reglas para poder diferenciar las diferentes razones del fracaso? Parece que si deny
implementara una palabra clave de denegación, esto sería fácil:
deny read 401: if !request.auth.uid deny read 403: if request.auth.uid !== resource.data.owner
Pero, por desgracia, no existe tal palabra clave deny
.
Ese mensaje no se puede personalizar a partir de ahora. Una forma de evitar esto podría ser no realizar la solicitud como primer lugar si el usuario no ha iniciado sesión. Por ejemplo:
if (getAuth().currentUser) { // fetch data } else { alert("Please login") }
Puede ser un poco desafiante para 401 y 403, pero si pudiera enumerar en qué casos puede haber un error 403, entonces definitivamente puede estructurar su código de esa manera.
Para 404, puede usar la propiedad .exists
si se devuelve DocumentSnapshot