Pour notre application, nous devons être en mesure d'offrir à des groupes un accès aux fichiers. Chaque utilisateur peut avoir un grand nombre de groupes, il n'est donc pas judicieux d'utiliser la solution du "jeton personnalisé" (qui est de toute façon très maladroite).
Comme je l'ai découvert, Firebase est très limité avec ses règles de sécurité de stockage. Le principal problème est que nous conservons des définitions de groupe dans Firestore, auxquelles les règles de sécurité de stockage n'ont pas accès.
Pour y remédier, nous avons décidé d'inclure dans les métadonnées de chaque fichier téléchargé un "jeton" auquel tout membre du groupe a accès. Lorsqu'ils téléchargent un fichier, ils doivent fournir ce jeton dans les paramètres de la requête (par exemple : /groups/xxx/filename.jpg?token=abc).
Alors je me suis lancé et j'ai écrit ces règles :
match /groups/{groupId}/{filename} {
allow read: if request.auth != null && request.params.token == resource.metadata.token;
allow write: if request.auth.uid == userId
&& request.resource.size < 1 * 1024 * 1024
&& request.resource.contentType.matches('image/.*')
&& (resource == null || request.resource.contentType == resource.contentType)
&& imageId.size() < 32
;
}
Mais lorsque je l'exécute dans le simulateur, j'obtiens l'erreur suivante : "Error : simulator.rules line [23], column [43]. Property params is undefined on object" qui pointe vers la règle avec "request.params.token".
La documentation indique spécifiquement que nous avons accès à l'objet params à partir de l'objet request : https://firebase.google.com/docs/storage/security/secure-files?authuser=0#request_evaluation