Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

149
Visualizações
Firebase 9, Remix: addDoc() devuelve el error "PERMISO DENIED"

Tengo una aplicación de remezclas que usa firebase y una base de datos firestore.

El inicio de sesión funciona bien, GET /documents también (no hay reglas para GET)

Cuando intento crear un nuevo documento con addDoc() , aparece el error PERMISSION DENIED .

Mis reglas:

 rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow create, update, delete: if request.auth != null && request.auth.token.email_verified && request.auth.token.email == 'my_email@gmail.com'; allow read: if true; } } }

Como uso Remix (SSR), estoy inicializando firebase en el lado del cliente:

 if (getApps().length === 0) { initializeApp({ apiKey: "...", authDomain: "...", projectId: "...", storageBucket: "...", messagingSenderId: "...", appId: "...", measurementId: "...", }); }

Y tengo firebase-admin en el lado del servidor:

 const serviceAccount = require("~/firebase-service-account.json"); serviceAccount.private_key_id = process.env.FIREBASE_PRIVATE_KEY_ID; serviceAccount.private_key = process.env.FIREBASE_PRIVATE_KEY; if (getApps().length === 0) { admin.initializeApp({ credential: admin.credential.cert(serviceAccount), }); }

Uso la autenticación de Google en el lado del cliente de esta manera:

 const submit = useSubmit(); const signInWithGoogle = async () => { const provider = new GoogleAuthProvider(); const { user } = await signInWithPopup(auth, provider); if (user) { const formData = new FormData(); formData.set("user", JSON.stringify(user)); submit(formData, { method: "post" }); } };

Luego formData es manejado por mi código del lado del servidor y crea una sessionCookie con auth().createSessionCookie() .

Todo funciona bien en mi tablero (solo pueden acceder los usuarios registrados, estoy usando auth().verifySessionCookie() para verificar eso) hasta que creo un nuevo documento con la función addDoc de firebase 9. auth proviene del paquete firebase-admin .

Aquí está el código que uso:

 const addDocument = async <T>(name: string, data: T): Promise<T> => { console.log(getAuth().currentUser) // null await addDoc(collection(db, name), data as Record<string, any>); cache().deleteEntry(name); return data; };

Cuando mi regla de escritura se establece en true , funciona bien, pero cuando pongo request.auth != null tengo el error de permiso, así que supongo que el problema está en la parte de autenticación.

about 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Si bien puede estar usando Admin SDK en el servidor, ese último fragmento de código es definitivamente un SDK de JavaScript normal (ya que Admin SDK no tiene el concepto de currentUser ). Cuando inicia la sesión del usuario en el cliente, ese estado no se transporta automáticamente a su código del lado del servidor.

El enfoque más común para acceder a Firebase desde el servidor hasta hace poco era usar el SDK de administrador (que omite las reglas de seguridad) y realizar verificaciones de autorización en el código de su aplicación.

Puede usar los SDK de JavaScript normales en el servidor, pero deberá asegurarse de que estén registrados. Hay algo de trabajo en progreso para hacer esto automáticamente para Next.js y Angular Universal, pero aún no para Remix.run. La forma en que funcionan (y lo que tendrías que hacer) es que:

  1. Pasar la información de inicio de sesión en las cookies de sesión
  2. Verifique el token de ID en el código del lado del servidor con Admin SDK.
  3. Si la verificación tiene éxito, acuñan un token personalizado para el usuario.
  4. Y luego inicie sesión con ese token personalizado en el SDK de JavaScript normal.

Deberá asegurarse de tener una instancia de FirebaseApp / Auth separada para cada usuario, y probablemente querrá configurar un caché LRU para evitar tener que realizar esa traducción en cada llamada.

about 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda