Estoy intentando usar varias bases de datos en tiempo real para mi único proyecto en Firebase. Para mi configuración, estoy generando tokens y enviándolos a los usuarios desde un servidor que no forma parte de los servidores de Google.
Todo funciona hasta ahora para la base de datos predeterminada, pero surgen problemas al intentar acceder a la segunda base de datos en tiempo real. He leído que puede ser porque tienes que generar un token para cada instancia de la aplicación, pero para evitar que se convierta en un proceso difícil, ¿es posible generar un solo token que pueda acceder a todas las bases de datos?
En mi servidor backend hacemos esto para generar un token:
initializeApp({ credential: admin.credential.cert(FirebaseCredentials), });por lo general, la siguiente línea es una URL de base de datos. Qué se pasa al archivo JSON de la cuenta de servicio.
¿Existe una manera fácil de permitir que un usuario use un token para acceder a todas las bases de datos si tuviéramos 10 de ellos o es la solución inicializar la aplicación y especificar una base de datos diferente cada vez con 10 tokens diferentes si los datos se distribuyen en 10 diferentes en tiempo real? bases de datos
Del lado del cliente, utilicé el token generado para registrarme. El token generado no especifica una URL de base de datos y parece usar la base de datos predeterminada. Cuando intento usar la segunda base de datos, traté de seguir las instrucciones de la base de datos múltiple.
const app2 = initializeApp({ databaseURL: '...'}, 'app2'); const db = getDatabase(app2); set(ref(db, 'users'), { user: 'me', });Cuando uso ese segundo, recibo permisos denegados. Las reglas son idénticas entre rtdbs. Supongo que es porque el token de configuración de mi aplicación original es para la base de datos predeterminada y no para la nueva. ¿Es posible usar de alguna manera un token único generado para todas las bases de datos?
Reglas de Firebase para ambas bases de datos.
{ "rules": { ".read": "auth.token.chatEnabled === true", ".write": "auth.token.chatEnabled === true" } }Así es como uso el token en el lado del cliente. Simplemente devuelvo el token desde el servidor. El cliente usa el SDK de Javascript para inicializar la aplicación con la configuración de Firebase generada desde el inicio inicial.
Entonces lo hago:
import { initializeApp } from "firebase/app"; import { getDatabase, ref, set } from 'firebase/database'; const firebaseConfig = { ... the config }; const app = initializeApp(firebaseConfig); const auth = getAuth(); await signInWithCustomToken(auth, token); const app2 = initializeApp({ databaseURL: 'secondatabaseurl' }, 'app2'); const db = getDatabase(app2); set(ref(db, 'users'), { user: 'me', });Creo que mi problema surge porque cuando voy a llamar a la segunda aplicación, el token generado parece ser solo utilizable para la primera aplicación o la configuración predeterminada.
Si todas mis bases de datos están en un solo proyecto, ¿tengo que crear una aplicación separada para cada nueva base de datos? Si es así, ¿eso significaría que necesito un token separado para cada instancia de la aplicación o iniciar sesión en cada instancia de la aplicación con el mismo token?
Gracias por tu tiempo.
No es la respuesta, pero puedo inicializar 2 aplicaciones diferentes.
Esto funciona ->
const secondaryApp = initializeApp({ appconfig2 }, 'secondaryApp'); const auth = getAuth(secondaryApp); const db = getDatabase(secondaryApp); await signInWithCustomToken(auth, token); set(ref(db, 'users'), { user: 'me', });Esto no funciona ->
const secondaryApp = initializeApp({ appconfig2 }, 'secondaryApp'); const auth = getAuth(secondaryApp); await signInWithCustomToken(auth, token); const db = getDatabase(secondaryApp); set(ref(db, 'users'), { user: 'me', }); // now try a second database const db2 = getDatabase(); set(ref(db2, 'users'), { user: 'me', });Según tengo entendido, getDatabase() extrae de la aplicación inicializada predeterminada. Parece que una vez que un usuario se autentica con una de las aplicaciones inicializadas (en este caso, el usuario se inicializó con una aplicación secundaria), esos detalles autenticados no se comparten con otras aplicaciones, al menos no estoy seguro de cómo compartirlos con todas las aplicaciones declaradas. Incluso si las configuraciones de la aplicación tienen claves API, dominios de autenticación, etc. idénticos, pero difieren en la URL de la base de datos, de alguna manera no se conectan.
Idealmente, una vez que un usuario se haya autenticado, debería tener acceso a todas las bases de datos en el único proyecto/aplicación, pero este no parece ser el caso aquí.
La última respuesta aquí podría ser la respuesta ->
Entonces, para acceder a otra base de datos, ¿un usuario debe autenticarse individualmente?
De acuerdo, ese enlace al final fue la respuesta, simplemente no esperaba tener que hacer esto.
Si especifica autenticación para cada base de datos, dado que las bases de datos se declaran en diferentes aplicaciones, debe autenticar al usuario con cada una antes de poder leer/escribir.
En otras palabras, para que funcione, tuve que iniciar sesión con un token personalizado para cada instancia de la base de datos.
const app1 = initializeApp(config1); const app2 = initializeApp(config2); const auth1 = getAuth(app1); const auth2 = getAuth(app2); await signInWithCustomToken(auth1, token); await signInWithCustomToken(auth2, token);luego puede usar cada instancia de la aplicación para obtener la base de datos (aplicación1/aplicación2).
Tal vez la razón de esto es que las personas pueden usar aplicaciones completamente diferentes. Tal vez haya alguna forma en el futuro de hacer que una aplicación con múltiples bases de datos fragmentadas en tiempo real no requiera autenticación en cada base de datos de aplicaciones. Tal vez sería en lugar de declarar una nueva aplicación para cada base de datos fragmentada, debería ser alguna otra función auxiliar.