Gérer la sécurité des données avec la Bdd noSql Firebase

Introduction


Une fois que l’on a créé son application Basée sur AngularJs(De préférence, pour faire du temps réel), Php ou Java, fonctionnant sur la Base de données Firebase, il faut bien sécuriser ses données.

Autrement dit, il ne faut pas qu’un utilisateur lambda puisse supprimer une partie ou l’intégralité de notre modèle de données JSON en ligne, évidemment…

 

Sommaire


  1. Empécher tous les utilisateurs de modifier les données.
  2. Empécher un utilisateur de lire ou d’écrire, si il n’est pas identifié.
  3. Charger les données d’un seul utilisateur, grâce à son identifiant.

 

Empécher tous les utilisateurs de lire ou modifier les données .


 

Sans se soucier de l’authentification, on peut déjà empécher facilement les utilisateurs de supprimer les données.

On se rends dans notre Dashboard, sur le site de Firebase, puis sous l’onglet « Security and rules », là, on va spécifier très facilement ce que les droits des utilisateurs sur nos divers modèles de données Json:

 

fb1

 

Voilà, en l’occurence, l’exemple . Par exemple, là, j’ai autorisé les droits en lecture sur tous mes modèles de données de mes applications, mais pas de droits en écriture !

Autrement dit, si quelqu’un essaye d’effacer une ville dans mon application « Evalue un Ville », il ne pourra plus. De même, il ne sera plus possible d’enregistrer une ville…

 

2. Empécher un utilisateur de lire ou d’écrire, si il n’est pas identifié dans Firebase.


Firebase possède un système automatisé d’identification, qui, une fois que l’on a compris, simplifie les accès à notre future App.

J’ai déjà parlé des 3 controleurs angularJs, qui vont nous permettre de gérer l’identification sécurisée en ligne sur Firebase.

Il y en a un pour créer un utilisateur, un pour s’identifier anonymement, un qui permet de s’identifier avec un log-in mot de passe .

Le code est déjà présent sur cet article et dans la doc de Firebase bien sur:

Une fois que l’on est sur d’avoir nos controleurs d’identification qui fonctionnent,  il faut aller sur firebase.com, puis dans le dashboard, sous l’onglet sécurité, attribuer les droits suivants au modèle de données JSON que l’on souhaite sécuriser :

fb2

Ici, j’ai donc ajouté le code de sécurisation (Les « Rules ») suivant à mon modèle de données JSON villes:

« .read »: « auth != null »,
« .write »: « auth != null »

Explication : Les rules permettent d’attribuer ou pas des droits sur nos modèles de données présents sur Firebase. Ils s’appliquent sur les modèles de données JSON présents sous l’onglet DATA du dashboard Firebase.

En l’occurence, plus haut, j’interdis la lecture et l’écriture de mon modèle de données VILLES, si la variable auth( qui est déclenché par le système d’identification de firebase) n’est pas active.

Autrement dit, pas de droits de lecture ou d’écriture si l’on est pas loggé sur firebase auparavant.

Le système semble relativement simple, une fois que l’on a compris. Le module qui s’occupe de ça est à injecter dans notre controleur, il s’appelle $firebaseAuth

fb3.jpg

A faire en second :
Sous l’onglet Login et Auth du dahsboard de Firebase, régler la durée de session sur 25 secondes, et voir la magie s’opérer :

 

Quand un user n’est pas loggé, il ne peut pas voir le contenu du modèle de données « VILLES », par contre, dès qu’il se loggue, il obtient les précieuses données.

En l’occurence, dans mon exemple, on voit qu’au bout de 25 secondes, les données disparraissent de l’écran hi hi hi ! , vu que l’utilisateur est automatiquement déloggué par firebase !

Voici un exemple fonctionnel à tester ici : Ce script permet la visualisation du modèle de données JSON « Articles » sur Firebase, seulement après avoir été identifié anonymement:

 

 

 Charger les données d’un seul utilisateur , grâce à son identifiant.


Lorsque l’on enregistre un utilisateur dans Firebase, Firebase génère un identifiant unique appelé UID ressemblant à : 5f9fe424-4323-4370-a280-9cb216dc6410 par exemple.

Voici la liste des utilisateurs de ma base par exemple :

fb3

Du coup, avec cet UID, si on organise bien sa base de données, on peut charger uniquement les données appartenant à l’uid concerné, vu que suite à la phase de login réussie, Firebase retourne l’UID de l’utilisateur au script AngularJs dans la fonction de rappel.

 

Voici un exemple d’organisation d’utilisateurs dans le dashboard de firebase, avec les  UID  en « clefs primaires »:

last

Du coup, après on peut quérir les données sous contrainte d’un UID utilisateur, avec une fonction Firebase de ce type :

$scope.utilisateurData = $firebaseObject(ref.child(‘users’).child(uid));

On obtient alors en temps réel, dans $scope.utilisateurData, l’intégralité de l’objet Firebase ayant l’UID que l’on choisit, par exemple 5f9fe424-4323-4370-a280-9cb216dc6410

 

 

Pour définir mes users de la sorte lors du Login j’utilise une fonction similaire :


/* IDENTIFICATION SUR FIREBASE AVEC LOG IN MOT DE PASSE */
var firebaseObj = new Firebase("https://blinding-heat-xxxx.firebaseio.com");
$scope.authObj = $firebaseAuth(firebaseObj);

$scope.login = function() {

$scope.authData = null;
$scope.error = null;

login.loading = true;
$scope.authObj.$authWithPassword({
email: $scope.email,
password: $scope.password
}).then(function(authData) {

CommonProp.setUtilisateur(authData.uid); // Service permettant de stocker l'UID
$scope.chargementDonnees(authData.uid);// Permet de charger les données sur firebase après authentifiaction

var isNewUser = true;
var ref = new Firebase("https://blinding-heat-xxxx.firebaseio.com");
ref.onAuth(function(authData) {

if (authData && isNewUser) {
// Si l'utilisateur est nouveau, on enregistre son profil dans firebase sous "Users", avec //l'uid qui a été généré par firebase, comme identifiant/clef

ref.child("users").child(authData.uid).set({
provider: authData.provider,
name: getName(authData)
});
}
});


}).catch(function(error) {
console.error("Identification ratée:", error);
$scope.error = error;
});
};

De ce fait, avec cette conception, on peut ensuite ajouter des « rules » (droits), qui permettront d’ajouter une sécurité supplémentaire, on peut par exemple spécifier que si  l’UID 5f9fe424-4323-4370-a280-9cb216dc6410 n’est pas identifié, alors il n’a pas accès à ses données, et les autres n’ont de toute manière pas accès non plus à ses « childs ».

Les rules de sécurité ressembles alors à cela :

"rules": {
    "users": {
      "$users": {
        ".read": "auth.uid === $users",
        ".write": false
      }
    }
}

On les gère sous l’onglet « Security » du dashboard de Firebase, de plus il existe un testeur

 

Cela devient plus compliqué à décrire, d’autant plus que WordPress buggue sur l’analyse de code, du coup je peux plus poster de codes, il faut analyser le code de mon application MedicSolutions pour comprendre comment faire les fonctions pour organiser tout ça.

Publicités