Comprendre les règles de sécurité Firebase Realtime Database

Les règles de sécurité de Firebase Realtime Database déterminent qui a accès en lecture et en écriture à votre base de données, la structure de vos données et les index existants. Ces règles sont mises en œuvre sur les serveurs Firebase et sont appliquées automatiquement en permanence. À chaque lecture et d'écriture ne sera traitée que si vos règles le permettent. Par défaut, vos règles n'autorisent personne à accéder à votre base de données. L'objectif est de protéger contre les utilisations abusives jusqu'à ce que vous ayez le temps de personnaliser vos règles ou de configurer l'authentification unique.

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
.read Décrit si et quand les utilisateurs sont autorisés à lire les données.
.write Décrit si et quand l'écriture de données est autorisée.
.validate Définit ce à quoi ressemblera une valeur correctement formatée, qu'elle comporte des attributs enfants et le type de données.
.indexOn Spécifie un enfant à indexer pour permettre l'ordre et les requêtes.

Présentation de la sécurité de Realtime Database

Firebase Realtime Database fournit un ensemble complet d'outils permettant de gérer la sécurité de votre application. Ces outils facilitent l'authentification des utilisateurs, d'appliquer les autorisations des utilisateurs et de valider les entrées.

Les applications optimisées par Firebase exécutent plus de code côté client que celles utilisant de nombreux autres piles technologiques. C'est pourquoi nous abordons la sécurité que ce à quoi vous êtes habitué.

Authentification

La première étape courante pour sécuriser votre application est identifier vos utilisateurs. Ce processus est appelé authentification. Vous pouvez utiliser Firebase Authentication pour que les utilisateurs se connectent à votre application. Firebase Authentication Il prend en charge directement les méthodes d'authentification courantes telles que Google et Facebook, ainsi que la connexion par e-mail et mot de passe, la connexion anonyme, etc.

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

Autorisation

L'identification de l'utilisateur n'est qu'une partie de la sécurité. Une fois que vous savez qui ils sont, vous devez trouver un moyen de contrôler leur accès aux données de votre base de données. Règles de sécurité Realtime Database vous permettent de contrôler l'accès pour chaque utilisateur. Par exemple, voici un ensemble de des règles de sécurité qui permettent à quiconque de lire le chemin /foo/, mais pas pour y écrire:

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

Les règles .read et .write sont appliquées en cascade. Cet ensemble de règles accorde un accès en lecture à toutes les données du chemin /foo/ ainsi qu'aux données chemins d'accès tels que /foo/bar/baz. Notez que .read et Les règles .write superficielles dans la base de données prévalent sur les règles plus profondes. l'accès en lecture à /foo/bar/baz serait quand même accordé dans cet exemple même si une règle sur le chemin /foo/bar/baz est évaluée comme étant "false".

Les règles de sécurité Realtime Database incluent variables intégrées et des fonctions qui vous permettent pour se référer à d'autres chemins, codes temporels côté serveur, informations d'authentification, et plus encore. Voici un exemple de règle qui accorde aux utilisateurs authentifiés un accès en écriture à /users/<uid>/, où <uid> est l'ID de l'utilisateur obtenu via Firebase Authentication.

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

Validation des données

Le Firebase Realtime Database est sans schéma. Vous pouvez ainsi modifier facilement les éléments au fur et à mesure du 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 des règles inclut un .validate qui vous permet d'appliquer une logique de validation à l'aide des 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. Par conséquent, toutes les règles de validation doivent prendre la valeur "true" pour que l'écriture soit autorisée.

Ces règles exigent que les données écrites dans /foo/ soient une chaîne comportant 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 utiliser pour créer des règles de validation qui prennent en compte les données situées ailleurs dans votre base de données, l'identité de vos utilisateurs, l'heure du serveur, et bien plus encore.

Définir des index de base de données

Firebase Realtime Database permet de trier et d'interroger des données. Pour le small data des requêtes ad hoc, les index ne sont généralement pas nécessaires pendant le développement. Avant de lancer votre application, il est important de spécifier des index pour toutes vos requêtes afin qu'elles continuent de fonctionner votre application se développe.

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

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

Étapes suivantes