Random permission errors when logging in with multiple tabs open
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- firebase, react, typescript
- Área
- authentication, database, frontend
Línea de trabajo
Reproduce el fallo usando enableMultiTabIndexedDbPersistence, la persistencia de getAuth() local del navegador, varias pestañas y una suscripción inmediata a useFirestoreDoc después del inicio de sesión. Empieza siguiendo los hooks de ReactFire y la ruta del observable de Suspense mencionados en el informe; la tarea estará terminada cuando todas las pestañas carguen el primer documento sin un error permission-denied.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Version info
React: 18.2.0
Firebase: 9.15.0
ReactFire: 4.2.2
Other (e.g. Node, browser, operating system) (if applicable):
Node: 18.4.0
Test case
When you have multi-tab persistence enabled (enableMultiTabIndexedDbPersistence) and you use the default auth persistence mode from getAuth() (browser local persistence), and your firebase app is open in multiple tabs, it occasionally fails to load the first requested document with a code=permission-denied error:
FirebaseError: [code=permission-denied]: Missing or insufficient permissions.
Here's a short video demonstrating the problem:
https://user-images.githubusercontent.com/307312/210944853-38bfaf81-dc8e-4627-a29d-c2b31ac4f0a9.mp4
When the tab where the error occurred is reloaded the app loads just fine. The symptoms are very similar to those described in https://github.com/FirebaseExtended/reactfire/issues/485 and https://github.com/FirebaseExtended/reactfire/discussions/228, but the workaround of clearing the observables cache does not prevent this issue from occurring. The problem I'm having here sounds identical to https://github.com/firebase/firebase-js-sdk/issues/1981, but when I try loading the user document with the vanilla firebase SDK I actually don't get any permissions errors. It only happens when using the reactfire hooks.
Unfortunately, due to https://github.com/FirebaseExtended/reactfire/issues/540 it's impossible to catch the permissions error and deal with it, so I've had to resort to a really ugly hack where I inspect the preloaded observables cache, find the observable associated with my user document, and check if ourError contains a permission-denied error. If it does, I force the window to reload. It's not ideal because the error boundary still flashes for a second, and the error ends up in the console, but it's better than failing to load the app entirely. Here's what the workaround looks like:
// In some functional component:
applyReactfireWorkaround(`:users/${authUser.data.uid}`);
const user = useFirestoreDoc(...);
function applyReactfireWorkaround(...keySubstrings: string[]): void {
const reactFirePreloadedObservables = (globalThis as Record<string, unknown>)['_reactFirePreloadedObservables'] as
| Map<string, unknown>
| undefined;
if (reactFirePreloadedObservables) {
const hasPermissionDeniedError = Array.from(reactFirePreloadedObservables.keys())
.filter((key) => key.startsWith('firestore:'))
.filter((key) => keySubstrings.every((substring) => key.includes(substring)))
.map((key) => reactFirePreloadedObservables.get(key) as SuspenseSubject<unknown>)
.some((subject) => (subject.ourError as FirebaseError | undefined)?.code === 'permission-denied');
if (hasPermissionDeniedError) {
globalThis.location.reload();
}
}
}
Steps to reproduce
Log in and out of a Firebase app with multi-tab persistence enabled and browser local auth. A document subscription should be made immediately after logging in, e.g. to a document representing the current user.
Expected behavior
All tabs load successfully.
Actual behavior
One or more tabs blow up when accessing the first document with useFirestoreDoc with the following error:
FirebaseError: [code=permission-denied]: Missing or insufficient permissions.
- Lenguaje dominante
- TypeScript
- Estrellas
- 3.6k
- Forks
- 403
- Merge medio
- 5 d 1 h
- PR fusionados (30 d)
- 10
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de FirebaseExtended/reactfire
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 38/100
FirebaseExtended/reactfire#801 ·
-
v5
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
FirebaseExtended/reactfire#793 ·
-
v5
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
FirebaseExtended/reactfire#790 · 2 comentarios ·
-
v5
Dificultad 4/5 3-5 días Aptitud para principiantes 55/100
FirebaseExtended/reactfire#789 ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
FirebaseExtended/reactfire#788 ·
Todos los issues de FirebaseExtended/reactfire
Issues similares
-
bug(cli): hapi doctor inline-media prints a fabricated B:\ helper-script path in packaged installs Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
Crush Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 85/100
catppuccin/catppuccin#3125 ·
-
Add a SECURITY.md Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
ElementsProject/cln-application#167 · 1 comentario · 1 reacción ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Quantco/pnpm-licenses#17 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100