Estoy creando una aplicación con sveltekit usando Firebase Authentication y Firestore. También cambié recientemente mis reglas de Firestore para allow read, write: if request.auth != null; . Sin embargo, mis páginas ahora se ven afectadas por las actualizaciones del navegador.
Cuando me dirijo a las páginas que requieren lectura de firestore, todo salió bien. Pero cuando actualicé, la página se actualizará a una página en blanco con la palabra 500 y mi consola registrará Missing or insufficient permissions.\nFirebaseError: Missing or insufficient permissions. Afortunadamente, mi barra de navegación todavía se muestra y funciona, y cuando navego lejos y vuelvo a la página, todo vuelve a aparecer. Leí que Firebase tarda una fracción de segundo en confirmar la autenticación y creo que eso está interfiriendo con mi página.
Como necesitaba proteger algunas páginas de la autenticación, implementé el código en mi página __layout.svelte .
__layout.esbelto
<script lang="ts" context="module"> import type { User } from 'firebase/auth'; import { onAuthStateChanged } from "firebase/auth"; import { auth } from "$lib/scripts/firebaseStart"; export async function load() { let authUser: Promise<unknown> = getAuthUser(); function getAuthUser() { return new Promise(resolve => { onAuthStateChanged( auth, user => resolve(user ? user : false) ); }); } return { props: { authUser } }; } </script> <script lang="ts"> import "../styles/global.css"; export let authUser: User|boolean; </script> <main> {#if authUser} <!-- page content --> <slot></slot> {/if} </main>El error que muestra parece provenir de uno de los productos de Firebase que está protegido por reglas de seguridad del lado del servidor e indica que su código está tratando de acceder a datos o archivos que no coinciden con las reglas que configuró.
De hecho, Firebase vuelve a autenticar las credenciales del usuario cuando la página se vuelve a cargar, lo que (dependiendo de la velocidad de su conexión) puede demorar más de una fracción de segundo.
No hay un usuario actual antes de que se complete esta llamada de autenticación, por lo que si sus reglas de seguridad requieren un usuario autenticado, debe acceder a los datos/archivos hasta que la autenticación se haya completado con éxito conectándose a la base de datos/almacenamiento de archivos solo una vez que su promesa getAuthUser se resuelve con el usuario actual.