Características generales

  • En tiempo real: todos los usuarios reciben las actualizaciones al realizarse cambios
  • Autenticación: comparte la autenticación con api para móviles (android e IOS), manteniendo los usuarios en ellos
  • Hosting: permite hostear sitios estáticos internamente
  • Mensajería: permite enviar mensajes a usuarios, llegando por medio de mensajes push (sólo móviles) a los dispositivos
  • Almacenamiento: almacenamiento de medias, disponibles para todos los usuarios
firebase se puede considerar un gran archivo json donde se puede consultar información dando una ruta de llaves como si fueran directorios en un servidor web, adicionando ".json" al final del último) y devuelve el valor de la última llave solicitada..
por ejemplo:
{
  "key1": {
    "key2": {
      3
    }
  }
}
$ curl https://example.firebase-io.com/key1/key2.json
3
ejemplo 2:
{
  "key1": {
    "key2": {
      "key3": {
        "a": 1,
        "b": 2,
      }
    }
  }
}
$ curl https://example.firebase-io.com/key1/key2.json
{
  "key3": {
    "a": 1,
    "b": 2,
  }
}

Desarrollo web con firebase

Setup para web:
  1. Crea un proyecto de Firebase en la consola Firebase console, si aún no está creado.
    • Si ya se tiene un proyecto de Google asociado a la app, se hace clic en Import Google Project. De lo contrario, en Create New Project.
    • Si ya se tiene un proyecto, haz clic en Add App en la página de información general del proyecto.
  2. Hacer clic en Add Firebase to your web app.
  3. Hacer clic en Copy, luego se pega el fragmento de código en el código de la app.
Setup para web:

Si se necesita volver a obtener el código de configuración, simplemente se usa Add App en la página de información general y se selecciona la opción Web nuevamente.

// TODO: personalizar según lo que se muestre en la página
  
  

El fragmento contiene información de inicialización para configurar el Firebase JavaScript SDK para que use Authentication, Storage y el Realtime Database.

Ejemplo de código en JavaScript


Inicialización


var ref = new Firebase("https://hai.firebaseio-demo.com/");


Escribir datos


ref.set("Hello, Developers!");


Leer datos


ref.on("value", function (snapshot) {
  var data = snapshot.val();
  console.log(data);
});

Además, se puede acceder directamente a la información definida como pública:


$.ajax({
  dataType: 'json',
  url: 'https://hai.firebaseio-demo.com/.json',
  data: data,
  success: success
});
...
$.getJSON('https://hai.firebaseio-demo.com/key1/key2.json', function (data) {
  console.log(data);
});

Autenticación de usuarios

Firebase cuenta con varios tipos de autenticación:
  • Autenticación por usuario y contraseña
  • Usuarios de Google
  • Usuarios de Facebook
  • Usuarios de Twitter
  • Usuarios de Github
  • Uso de un sistema personalizado de autenticación
  • Autenticación anónima

Una vez que se identifica al usuario, se guarda el UID como referencia, el cuál se puede utilizar luego para identificar el usuario en otros módulos, como el control de acceso.

La "autenticación" anónima no autentica, sino que sólo identifica a cada cliente por medio de un email, sin validación.

Por lo que si se genera un email mediante código (ficticio, pero único entre los dispositivos) y se almacena en una cookie para que no se necesite generar nuevamente, se puede identificar a los usuarios sin necesidad de solicitarles información.

Control de acceso

La seguridad en firebase es muy simple.. se da acceso de lectura o escritura y se verifican los accesos utilizando código javascript

Regla de acceso:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
  }
}

Regla de acceso:

{
  "rules": {
    "i18n": {
      ".read": true,
      ".write": false
  	},
  	"events": {
      ".read": "auth.provider == 'google' && ( auth.token.email.matches(/.*@ejemplo.com$/) || auth.token.email == 'ejemplo@gmail.com' )",
        "$event": {
            "$user": {
                ".read": "auth.uid === $user || (auth.provider == 'google' && ( auth.token.email.matches(/.*@ejemplo.com$/) || auth.token.email == 'ejemplo@gmail.com' ))",
                ".write": "auth.uid === $user"
            }
        }
  	},
  	"config": {
      ".read": true,
      ".write": false
    }
  }
}

"i18n" y "config" sólo se podrán acceder de lectura, pero nadie puede escribir (sólo se podría desde la consola de administración de firebase)

"i18n": {
  ".read": true,
  ".write": false
}
.......
"config": {
  ".read": true,
  ".write": false
}

ruta: "/events/$event/$user" .. donde "$event" y "$user" son variables en la ruta

"events": {
".read": "auth.provider == 'google' && ( auth.token.email.matches(/.*@ejemplo.com$/) || auth.token.email == 'ejemplo@gmail.com' )",
  "$event": {
      "$user": {
          ".read": "auth.uid === $user || (auth.provider == 'google' && ( auth.token.email.matches(/.*@ejemplo.com$/) || auth.token.email == 'ejemplo@gmail.com' ))",
          ".write": "auth.uid === $user"
      }
  }
}
  • "events" sólo se podrá leer si está autenticado por el proveeder "google" y además el email del usuario en google está en el dominio "ejemplo.com" o es "ejemplo@gmail.com"
  • "events/$event/$user":
    • se podrá leer si el uid del usuario en firebase coincide con "$user" o si está autenticado por el proveeder "google" y además el email del usuario en google está en el dominio "ejemplo.com" o es "ejemplo@gmail.com"
    • se podrá escribir si el uid del usuario en firebase coincide con "$user"

Restricciones

referencia

  • la profundidad de nodos hijos es de 32
  • longitus de las llaves: 768 bytes
  • "$", "#", "[", "]", "/", "." o caracteres ASCII del 0 al 31 y 127 no son permitidos en las llaves del json
  • tamaño de nodo hijo: 10MB

Continuará..