2 votes

Ajout d'un jeton à Firebase Storage pour la sécurité du groupe

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".

enter image description here

enter image description here

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

enter image description here

1voto

Doug Stevenson Points 6978

Il semble que vous essayez de proxyer certaines données de Cloud Firestore dans une demande de stockage en nuage pour les utiliser dans les règles de sécurité. Ceci n'est actuellement pas réalisable. (En plus de cela request.params fait actuellement référence à des API qui ne sont pas documentées, de sorte qu'il ne peut pas vraiment être utilisé. J'ai soulevé cette question avec l'équipe, et nous pensons que request.params devrait probablement être supprimée des docs sur les règles de sécurité).

Si vous souhaitez attribuer à un utilisateur de Firebase Auth une identité de groupe qui peut être vérifiée dans tous les produits (Firestore, Storage, et Realtime Database), vous pouvez utiliser demandes personnalisées pour ça. Il faudra travailler un peu sur votre backend pour affecter, directement au compte utilisateur, la ou les valeurs que vous voulez vérifier. Si vous le faites correctement, les valeurs définies dans ce blob JSON apparaîtront dans le fichier request.auth.token dans les deux Firestore y Stockage les règles de sécurité.

1voto

checklist Points 400

En raison des limitations sévères de Firebase à interroger les données de Firestore dans Storage et de la documentation incorrecte concernant la non-disponibilité de request.param, nous avons dû utiliser une approche différente.

Nous avons décidé d'utiliser l'URL suivante lors de l'interrogation des fichiers d'un groupe :

/groupes/{groupId}/{token}/{filename}

La seule exigence de sécurité est que l'utilisateur soit connecté. Étant donné que le jeton ci-dessus est un secret et n'est disponible que pour les membres du groupe, nous estimons qu'il est assez sûr. Nous n'autorisons pas l'énumération des répertoires, il n'est donc pas possible d'énumérer simplement le répertoire /groups/{groupId} pour trouver des jetons.

Remarque : une autre optimisation pourrait consister à ne pas inclure le {groupId} dans le chemin, mais nous avons estimé qu'il était préférable de l'inclure à des fins de débogage et de gestion.

Si quelqu'un pense que c'est une manière peu sûre, faites-le nous savoir dans les commentaires !

Gracias.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X