Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

355
Vistas
Acceda al lado del servidor de Firebase Cloud Storage con reglas de seguridad aplicadas

En mi aplicación Firebase, me gustaría conocer la forma recomendada de realizar una solicitud del lado del servidor a Cloud Storage para Firebase en nombre de un usuario que inició sesión (autenticado a través del token de ID), con reglas de seguridad aplicadas a la solicitud (es decir, no con el SDK de administrador).

El flujo general de la aplicación actualmente se ve así:

  • El usuario inicia sesión en el cliente y realiza una solicitud a una puerta de enlace API de Google Cloud, enviando su token de identificación en el encabezado de la solicitud.
  • La puerta de enlace API autentica al usuario y reenvía la solicitud a diferentes puntos finales en la API backend:
    • Si se trata de una solicitud de autenticación de Firebase , la API usa el SDK de administrador de autenticación para manejarla directamente.
    • Si es para Firestore , la API usa el encabezado de solicitud x-forwarded-authorization (que contiene el token de ID proporcionado originalmente por el cliente) reenviado por la puerta de enlace API para luego realizar una solicitud a la API REST de Firestore , de modo que la solicitud pueda ser evaluada por reglas de seguridad

Para Cloud Storage , me gustaría hacer algo similar al caso anterior de Firestore, pero no hay una API REST específica de Firebase disponible en los documentos. Es posible dejar que el cliente realice solicitudes directamente a Firebase (como se sugiere en esta respuesta ), pero preferiría mantener la lógica en el backend.

¿Hay alternativas a hacer esto para el almacenamiento? No dude en señalar también si hay mejores formas de manejar los casos de Firebase Auth y Firestore mencionados anteriormente. ¡Gracias!

EDITAR: Agregar más soluciones posibles a medida que las encuentro

  • La respuesta de Doug aquí y la respuesta de Frank aquí sugieren usar la API REST de Cloud Storage, donde la aplicación genera un token de OAuth para el usuario y realiza la solicitud .
  • Esta respuesta aquí menciona que es posible pasar un parámetro de consulta auth=IDTOKEN a la API REST de Firebase:

Una vez que tenga un token de ID, puede pasarlo a la API REST a través del parámetro de consulta de autenticación para autenticar una solicitud. La solicitud respeta las reglas de seguridad de Firebase como si el usuario final iniciara sesión en el cliente estuviera realizando la solicitud.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

No hay forma de hacer cumplir las reglas de seguridad de Firebase para Cloud Storage cuando se usa Admin SDK. Firebase no proporciona una API REST documentada para Cloud Storage y dudo que la API REST de Google Cloud para almacenamiento acepte tokens de ID de Firebase.

Entonces, realmente no creo que tenga buenas opciones para hacer esto desde el servidor en nombre de sus usuarios. Las dos opciones que se me ocurren:

  1. Pase la información necesaria al cliente y permita que acceda a los datos a través del SDK de Firebase, en cuyo caso se aplican las reglas de seguridad.
  2. Replique la lógica de seguridad necesaria en su código de Cloud Functions.
over 4 years ago · Santiago Trujillo Denunciar

0

Edición 6 de enero de 2020: este método ha tenido un par de días de prueba bajo carga pesada. Consulte la parte inferior para ver algunos requisitos nuevos menores.

Respuesta original: esta no es una respuesta, sino una solución alternativa dentro del ecosistema (¡eso funciona para mí!)

Básicamente, tengo un caso de uso similar con respecto a un dispositivo iot sin conexión primero/potencialmente inseguro que necesita acceso de almacenamiento basado en autenticación con reglas de seguridad. Esta mañana eché un vistazo al repositorio SDK de Firebase js y noté que una API XHR nativa es la pieza principal que falta en la implementación de un nodo de trabajo.

Detallé mi solución en este problema de github ... incluido aquí por conveniencia:

.. parchear la biblioteca de almacenamiento con un polyfill XHR en realidad parece funcionar (Nodo 15 / pruebas mínimas hasta ahora). Específicamente, instalé xmlhttprequest-ssl y lo importé en la parte superior del módulo de almacenamiento (en mi caso, la línea 5 en @firebase/storage/dist/index.cjs.js ):

 var XMLHttpRequest = require("xmlhttprequest-ssl").XMLHttpRequest;

De vuelta en la aplicación, importo firebase/storage como de costumbre, luego solo cargo los archivos del sistema de archivos local y los cargo según la API estándar de Firebase:

 import { firebase } from "@firebase/app"; import "@firebase/storage"; /* include Firebase setup, etc. */ const filename = 'offline-user-generated-image.jpg'; const file = fs.readFileSync(filename); // for brevity only const ref = firebase.storage().ref().child(`test/${filename}`); // use the buffer's underlying arraybuffer ref.put(file.buffer, { contentType: 'image/jpg', // defaults to 'application/octet-stream' customMetadata: { uid: 'abc123', // for enhanced security rules }, }) .then(() => console.log('done')) .catch(e => console.log(e));

Las reglas de almacenamiento se aplican a las cargas (¡guau!) y los tokens de seguridad y los metadatos personalizados se aplican como se esperaba. También probado con `putString'. Esto resuelve algunas soluciones alternativas bastante drásticas para mi caso de uso, ya que significa que puedo mantener mi lógica/autorización/etc. completamente dentro del ecosistema de Firebase. Ganas de escuchar los pensamientos de los demás.

Nota: Estoy usando el paquete de parches para asegurar que el parche permanezca intacto durante las instalaciones/actualizaciones.

Actualización 6 de enero de 2020: algunas piezas adicionales

Resulta que hay un tiempo de espera no aclarado en el paquete de almacenamiento que causa problemas con los procesos de los nodos (y es probable que consuma recursos en todos los entornos). He enviado un PR (prácticamente un clearTimeout ) que resuelve el problema, pero mientras tanto, esto también deberá parchearse manualmente a menos que pueda process.exit(0) en su código.

over 4 years ago · Santiago Trujillo Denunciar

0

Después de considerar las diversas opciones anteriores (¡gracias Frank y som!), la mejor opción en mi situación fue cambiar las cosas y realizar solicitudes de almacenamiento directamente desde el cliente . Las 2 razones principales fueron:

  • Es el más sencillo de implementar ya que existe un SDK que te permite hacer esto
  • Interactuar con Firebase Storage puede involucrar objetos grandes, por lo que la experiencia del usuario puede verse afectada si hay demasiados viajes de red.

Al realizar la solicitud del cliente, la respuesta anterior de som y esta respuesta pueden ser útiles si hay un error XMLHttpRequest is not defined

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda