Comprendre les règles de sécurité de la base de données en temps réel Firebase

Les règles de sécurité de la base de données en temps réel Firebase déterminent qui a un accès en lecture et en écriture à votre base de données, comment vos données sont structurées et quels index existent. Ces règles résident sur les serveurs Firebase et sont appliquées automatiquement à tout moment. Chaque demande de lecture et d'écriture ne sera complétée que si vos règles le permettent. Par défaut, vos règles n'autorisent personne à accéder à votre base de données. Il s'agit de protéger votre base de données contre les abus jusqu'à ce que vous ayez le temps de personnaliser vos règles ou de configurer l'authentification.

Les règles de sécurité des bases de données en temps réel ont une syntaxe de type JavaScript et se déclinent en quatre types :

Types de règles
.lire Décrit si et quand les données peuvent être lues par les utilisateurs.
.écrire Décrit si et quand l’écriture des données est autorisée.
.valider Définit à quoi ressemblera une valeur correctement formatée, si elle possède des attributs enfants et le type de données.
.indexOn Spécifie un enfant à indexer pour prendre en charge le classement et les requêtes.

Présentation de la sécurité des bases de données en temps réel

La base de données Firebase Realtime fournit un ensemble complet d'outils pour gérer la sécurité de votre application. Ces outils facilitent l'authentification de vos utilisateurs, l'application des autorisations des utilisateurs et la validation des entrées.

Les applications basées sur Firebase exécutent plus de code côté client que celles dotées de nombreuses autres piles technologiques. Par conséquent, la façon dont nous abordons la sécurité peut être un peu différente de celle à laquelle vous êtes habitué.

Authentification

Une première étape courante pour sécuriser votre application consiste à identifier vos utilisateurs. Ce processus est appelé authentification . Vous pouvez utiliser l'authentification Firebase pour permettre aux utilisateurs de se connecter à votre application. L'authentification Firebase inclut la prise en charge immédiate des méthodes d'authentification courantes telles que Google et Facebook, ainsi que la connexion par e-mail et par mot de passe, la connexion anonyme, etc.

L'identité de l'utilisateur est un concept de sécurité important. Différents utilisateurs disposent de données différentes et ont parfois des capacités différentes. Par exemple, dans une application de chat, chaque message est associé à l'utilisateur qui l'a créé. Les utilisateurs peuvent également avoir la possibilité de supprimer leurs propres messages, mais pas ceux publiés par d'autres utilisateurs.

Autorisation

L'identification de votre utilisateur n'est qu'une partie de la sécurité. Une fois que vous savez qui ils sont, vous avez besoin d’un moyen de contrôler leur accès aux données de votre base de données. Les règles de sécurité de la base de données en temps réel vous permettent de contrôler l'accès de chaque utilisateur. Par exemple, voici un ensemble de règles de sécurité qui permettent à quiconque de lire le chemin /foo/ , mais à personne d'y écrire :

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

Les règles .read et .write sont en cascade, de sorte que cet ensemble de règles accorde un accès en lecture à toutes les données du chemin /foo/ ainsi qu'à tous les chemins plus profonds tels que /foo/bar/baz . Notez que les règles .read et .write moins profondes dans la base de données remplacent les règles plus profondes, donc l'accès en lecture à /foo/bar/baz serait toujours accordé dans cet exemple même si une règle sur le chemin /foo/bar/baz était évaluée à false.

Les règles de sécurité de la base de données en temps réel incluent des variables et des fonctions intégrées qui vous permettent de faire référence à d'autres chemins, à des horodatages côté serveur, à des informations d'authentification, etc. Voici un exemple de règle qui accorde un accès en écriture aux utilisateurs authentifiés à /users/<uid>/ , où <uid> est l'ID de l'utilisateur obtenu via l'authentification Firebase.

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

La validation des données

La base de données Firebase Realtime est sans schéma. Cela facilite la modification des éléments au fur et à mesure de votre développement, mais une fois que votre application est prête à être distribuée, il est important que les données restent cohérentes. Le langage de règles comprend une règle .validate qui vous permet d'appliquer une logique de validation en utilisant les mêmes expressions que celles utilisées pour les règles .read et .write . La seule différence est que les règles de validation ne sont pas appliquées en cascade . Toutes les règles de validation pertinentes doivent donc être évaluées à true pour que l'écriture soit autorisée.

Ces règles imposent que les données écrites dans /foo/ doivent être une chaîne de moins de 100 caractères :

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Les règles de validation ont accès à toutes les mêmes fonctions et variables intégrées que les règles .read et .write . Vous pouvez les utiliser pour créer des règles de validation qui prennent en compte les données ailleurs dans votre base de données, l'identité de votre utilisateur, l'heure du serveur et bien plus encore.

Définition des index de base de données

La base de données en temps réel Firebase permet de trier et d'interroger des données. Pour les données de petite taille, la base de données prend en charge les requêtes ad hoc, de sorte que les index ne sont généralement pas requis pendant le développement. Cependant, avant de lancer votre application, il est important de spécifier des index pour toutes les requêtes que vous avez afin de vous assurer qu'elles continuent de fonctionner à mesure que votre application se développe.

Les index sont spécifiés à l'aide de la règle .indexOn . Voici un exemple de déclaration d'index qui indexerait les champs de hauteur et de longueur pour une liste de dinosaures :

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Prochaines étapes