Security & Privacy
Guide Sécurisation des Applications avec Parse pour Développeurs
23 min
comment créer une application sécurisée en utilisant parse introduction ahoy communauté back4app ! ceci est un tutoriel invité de joren winge sur startup soul http //startup soul com/ nous aidons les startups à construire et lancer rapidement leurs produits nos amis @ back4app nous ont demandé de vous montrer comment construire une application sécurisée sur back4app dans cet article, nous allons vous guider à travers les étapes pour créer une application to do sécurisée sur back4app la sécurité est importante si votre application décolle, vous devrez vous assurer que les données de votre application sont sécurisées et que votre système ne peut pas être piraté fonctionnalités de sécurité sur parse commençons par parler du premier niveau de sécurité, les acl (listes de contrôle d'accès) les acl sont essentiellement des règles que vous définissez lorsque vous créez un objet disons que vous créez un élément de liste de tâches, au moment de la création, vous pouvez dire qui peut lire l'élément et qui peut y écrire vous pouvez attribuer à certains utilisateurs le droit de lire cet élément ou d'écrire dans cet élément, ou vous pouvez définir l'un ou l'autre comme public, ce qui permet l'accès à quiconque mais les acl ne fonctionnent pas toujours il existe des cas où vous pourriez avoir besoin d'une logique plus sophistiquée au lieu d'une simple acl parfois, vous pouvez également vous retrouver dans une situation où vous devez donner à quelqu'un l'accès à un objet sur une base conditionnelle au lieu d'une base absolue comme avec les acl donc, évitons d'utiliser les acl elles sont trop rigides et en même temps permettent trop d'accès aux données je suis sur le point de vous donner le secret pour construire une application sécurisée sur back4app et parse server prêt ? permissions au niveau de la classe ! oui, nous allons définir des permissions au niveau de la classe pour chaque table de notre base de données et le niveau de permission que nous allons définir est aucune permission du tout nous allons verrouiller chaque table afin qu'aucun accès en lecture ou en écriture ne soit autorisé à quiconque ! cela semble extrême, je sais, mais c'est la première étape pour créer une application sécurisée la seule permission que nous allons autoriser est sur la table utilisateur, qui sera pour la création de nouveaux objets utilisateur et pour que l'utilisateur puisse voir ses propres données, ce qui est nécessaire pour actualiser l'utilisateur actuel nous allons protéger l'utilisateur afin qu'il ne puisse pas voir les données des autres utilisateurs en utilisant des acl c'est la seule fois où nous utiliserons des acl, donc je suppose qu'elles ne sont pas totalement inutiles elles sont bonnes à avoir mais ne comptez pas sur elles pour tout faire mais comment allons nous accéder aux données, vous demandez ? bonne question, je suis content que vous y pensiez ! eh bien, le secret pour permettre aux clients d'accéder aux données de manière contrôlée est de faire en sorte que chaque interaction entre le client et la base de données soit filtrée par une fonction de code cloud oui, chaque fois que vous faites quelque chose avec votre application, ce sera désormais via une fonction de code cloud personnalisée plus de pfqueries basées sur le client vous évitez pratiquement d'utiliser l'ensemble du sdk parse basé sur le client, sauf pour les fonctions d'inscription, les fonctions de connexion, les fonctions de mot de passe oublié et les fonctions de déconnexion pour cela, nous utiliserons toujours les sdk natifs du client c'est juste plus facile avez vous déjà écrit du code cloud auparavant ? non, dites vous ? eh bien, c'est assez facile c'est juste du javascript et cela utilise le sdk javascript de parse mais en interne sur le serveur de votre propre application en fait, puisque parse server est basé sur node js, c'est assez similaire à l'écriture de routes avec express, mais encore plus facile puisque votre langage de requête est déjà installé et que les fonctions de code cloud sont beaucoup plus faciles à écrire qu'une application entière node js express alors voici ce que nous allons faire nous allons utiliser une application de todo ios que j'ai déjà créée nous ne nous embêterons pas à vous montrer comment je l'ai créée au lieu de cela, nous allons nous concentrer sur l'écriture de code cloud et la sécurisation de la base de données l'application de todo sera une application sécurisée où vous ne pouvez accéder qu'à vos propres todos et vous ne pouvez écrire que vos propres todos les données seront sécurisées sur le serveur, à l'abri des clients malveillants je vais également vous montrer comment écrire un travail d'arrière plan sécurisé avec parse essentiellement, la même chose qu'un travail cron afin que vous puissiez avoir des services automatisés pour manipuler vos données selon un calendrier cela semble compliqué mais ce n'est pas le cas imaginez juste de petits robots serveurs qui font ce que vous voulez selon un calendrier automatisé ça a l'air cool, non ? ok, alors c'est parti !!!!!! configurons l'application todo sécurisée back4app 1\) créez une application sur back4app créez une nouvelle application sur back4app appelez l'application ‘secure todo app’ remarque suivez le tutoriel de nouvelle application parse pour apprendre à créer une application sur back4app allez sur la page des paramètres principaux de l'application, puis cliquez sur modifier les détails de l'application désactivez la case à cocher appelée ‘autoriser la création de classes client’ pour désactiver la création de classes client et cliquez sur enregistrer nous voulons limiter ce que le client peut faire en règle 2\) définissez les autorisations de sécurité au niveau de la classe pour la classe utilisateur ensuite, nous allons définir les autorisations pour la classe utilisateur allez dans le tableau de bord de la base de données back4app et cliquez sur la classe utilisateur ensuite, cliquez sur l'onglet sécurité, puis cliquez sur l'icône d'engrenage en haut à droite vous devriez voir un menu qui dit simple/avancé faites glisser le curseur vers avancé vous devriez alors voir les autorisations de niveau de classe complètes pour cette classe désactivez la case à cocher trouver désactivez la case à cocher mettre à jour et supprimer enfin, désactivez la case à cocher ajouter un champ ensuite, cliquez sur enregistrer vos paramètres de sécurité devraient ressembler à ceci 3\) créez la classe todo cliquez sur créer une classe et appelez la todo définissez le type de classe comme personnalisé 4\) définissez les autorisations de sécurité au niveau de la classe pour la classe todo ensuite, nous allons définir les autorisations pour la classe todo allez dans le tableau de bord de la base de données back4app et cliquez sur la classe todo ensuite, cliquez sur l'onglet sécurité, puis cliquez sur l'icône d'engrenage en haut à droite vous devriez voir un menu qui dit simple/avancé faites glisser le curseur vers avancé vous devriez alors voir les autorisations de niveau de classe complètes pour cette classe désactivez tout puis cliquez sur enregistrer vos paramètres de sécurité devraient ressembler à ceci 5\) ajoutons quelques colonnes à la classe todo tout d'abord, joignons la classe todo à la classe user nous allons le faire en ajoutant 2 colonnes la première colonne s'appellera ‘user’ et sera un pointeur vers la classe utilisateur ensuite, créons une colonne pour l'identifiant de l'objet de l'utilisateur qui l'a créé ce sera de type chaîne et s'appellera ‘userobjectid’ ensuite, créons une colonne pour contenir nos informations de todo réelles ce sera également une chaîne et s'appellera ‘tododescription’ créons un booléen pour tenir l'état du todo appelons le ‘finished’ enfin, ajoutons une colonne supplémentaire pour contenir la date à laquelle vous avez terminé votre todo appelons la ‘finisheddate’ et définissons la comme un type date votre classe todo devrait ressembler à ceci 6\) passons en revue le client le client est une application de todo assez basique il utilise les fonctions intégrées de parse pour se connecter, créer un nouvel utilisateur et réinitialiser votre mot de passe en dehors de cela, tout est basé sur le code cloud et sécurisé les acl de l'utilisateur sont également définies dès qu'il se connecte ou s'inscrit juste pour être sûr à 100% que le système est sécurisé commençons par écrire la fonction de code cloud pour définir les acl de l'utilisateur lors de la connexion ou de l'inscription à tout moment, vous pouvez accéder au projet ios complet construit avec ce tutoriel à ce dépôt github vous pouvez également accéder au fichier de code cloud main js construit pour ce tutoriel à ce dépôt github 1 dans le client, allez à todocontroller swift et recherchez la fonction setusersaclsnow cette fonction est appelée lorsque vous vous connectez ou visualisez loggedinviewcontroller swift la fonction vérifie si vous êtes connecté et si c'est le cas, elle appelle la fonction cloud pour configurer vos acl d'utilisateur personnel todocontroller swift 1 func setusersaclsnow(){ 2 if pfuser current() != nil{ 3 let cloudparams \[anyhashable\ string] = \["test" "test"] 4 pfcloud callfunction(inbackground setusersacls, withparameters cloudparams, block { 5 (result any?, error error?) > void in 6 if error != nil { 7 //print(error debugdescription) 8 if let descrip = error? localizeddescription{ 9 print(descrip) 10 } 11 }else{ 12 print(result as! string) 13 } 14 }) 15 } 16 } 2 maintenant, écrivons la fonction de code cloud parse server 3 x 1 parse cloud define('setusersacls', async(request) => { 2 let currentuser = request user; 3 currentuser setacl(new parse acl(currentuser)); 4 return await currentuser save(null, { usemasterkey true }); 5 }); parse server 2 x 1 parse cloud define('setusersacls', function (request, response) { 2 var currentuser = request user; 3 currentuser setacl(new parse acl(currentuser)); 4 currentuser save(null, { 5 usemasterkey true, 6 success function (object) { 7 response success("acls updated"); 8 }, 9 error function (object, error) { 10 response error("got an error " + error code + " " + error description); 11 } 12 }); 13 }); 3 ce code cloud utilise deux fonctionnalités clés pour sécuriser votre application, request user et masterkey request user vous permet d'accéder à l'utilisateur qui effectue l'appel de code cloud et vous permet de limiter l'accès pour cet utilisateur dans ce cas, nous l'utilisons pour définir les acl de l'utilisateur afin de limiter l'accès en lecture uniquement à l'utilisateur actuel de cette manière, seul l'utilisateur peut lire ses propres informations les autorisations au niveau de la classe empêchent l'accès en écriture même pour l'utilisateur actuel de cette façon, les utilisateurs ne peuvent pas modifier leurs propres informations ils ne peuvent changer des choses concernant leur propre utilisateur que par le biais du code cloud il est possible d'importer de fausses informations lorsque l'utilisateur s'inscrit pour la première fois, mais je recommanderais d'écrire une fonction de code cloud pour vérifier les informations de l'utilisateur après qu'un nouvel utilisateur a été créé la fonction intégrée de parse pour créer un nouvel utilisateur est vraiment utile, donc je pense que c'est un compromis raisonnable, mais vous pouvez toujours définir les valeurs par défaut pour l'utilisateur via le code cloud juste après son inscription il existe de nombreux dispositifs de sécurité que vous pouvez également écrire dans le code cloud et les faire fonctionner automatiquement et continuellement en utilisant des tâches d'arrière plan pour détecter toute information utilisateur malveillante qui a été importée lors de la création initiale de l'utilisateur si vous voulez être vraiment sécurisé, vous pouvez stocker toute information sensible comme le statut d'adhésion ou les informations de paiement dans une table séparée de la table utilisateur de cette façon, l'utilisateur ne peut pas falsifier d'informations sensibles lors de la création de l'utilisateur 4 ensuite, regardons comment créer un todo dans le client, allez dans todocontroller swift et cherchez la fonction savetodo cette fonction est appelée lorsque vous créez un nouveau todo la fonction prend une chaîne qui décrit le todo et l'enregistre dans la base de données todocontroller swift 1 func savetodo(todostring\ string, completion @escaping ( result bool, message\ string, todoarray \[todo]) >()){ 2 var resulttodoarray \[todo] = \[] 3 let cloudparams \[anyhashable\ any] = \["todostring"\ todostring] 4 pfcloud callfunction(inbackground createtodosforuser, withparameters cloudparams, block { 5 (result any?, error error?) > void in 6 if error != nil { 7 if let descrip = error? localizeddescription{ 8 completion(false, descrip, resulttodoarray) 9 } 10 }else{ 11 resulttodoarray = result as! \[todo] 12 completion(true, "success", resulttodoarray) 13 } 14 }) 15 } 5 maintenant, écrivons la fonction de code cloud pour enregistrer le todo dans la base de données parse server 3 x 1 parse cloud define("createtodosforuser", async(request) => { 2 let currentuser = request user; 3 let todostring = request params todostring; 4 let todo = parse object extend("todo"); 5 let todo = new todo(); 6 todo set("user", currentuser); 7 todo set("userobjectid", currentuser id); 8 todo set("tododescription", todostring); 9 todo set("finished", false); 10 return await todo save(null, { usemasterkey true }); 11 }); parse server 2 x 1 parse cloud define("createtodosforuser", function(request, response) { 2 var currentuser = request user; 3 var todostring = request params todostring; 4 var todo = parse object extend("todo"); 5 var todo = new todo(); 6 todo set("user", currentuser); 7 todo set("userobjectid", currentuser id); 8 todo set("tododescription", todostring); 9 todo set("finished", false); 10 todo save(null, { 11 usemasterkey true, 12 success function (object) { 13 response success(\[todo]); 14 }, 15 error function (object, error) { 16 response error("got an error " + error code + " " + error description); 17 } 18 }); 19 }); 6 cette fonction de code cloud crée un objet todo et définit l'utilisateur actuel comme le propriétaire de l'objet c'est important pour que seul l'utilisateur qui l'a créé puisse le trouver ou le modifier en n'autorisant pas la création de todos dans le client, nous forçons l'objet todo à se conformer à nos normes et nous assurons que les todos sont la propriété de l'utilisateur qui les a créés 7 ensuite, examinons la récupération des todos que vous avez créés depuis le serveur dans le client, allez dans todocontroller swift et recherchez la fonction gettodosfordate cette fonction est appelée lorsque vous récupérez vos todos la fonction prend une date comme paramètre et l'utilise pour récupérer une liste de todos qui ont été créés par vous avant cette date dans l'ordre décroissant utiliser une date est un excellent moyen d'écrire une requête de chargement paresseux qui n'utilise pas de skips skip peut parfois échouer sur un grand ensemble de données todocontroller swift 1 func savetodo(todostring\ string, completion @escaping ( result bool, message\ string, todoarray \[todo]) >()){ 2 var resulttodoarray \[todo] = \[] 3 let cloudparams \[anyhashable\ any] = \["date"\ date] 4 pfcloud callfunction(inbackground gettodosforuser, withparameters cloudparams, block { 5 (result any?, error error?) > void in 6 if error != nil { 7 if let descrip = error? localizeddescription{ 8 completion(false, descrip, resulttodoarray) 9 } 10 }else{ 11 resulttodoarray = result as! \[todo] 12 completion(true, "success", resulttodoarray) 13 } 14 }) 15 } 8 maintenant, écrivons la fonction de code cloud pour récupérer les todos de la base de données en fonction d'une date de départ nous interrogeons les todos qui sont créés avant la date de paramètre, donc nous utilisons ‘query lessthan’ car les dates sont essentiellement des nombres qui deviennent plus grands plus vous vous éloignez dans le futur j'ai également inclus un code délicat ici disons que nous incluons l'objet utilisateur qui a créé le todo, mais nous ne voulons pas partager d'informations sensibles sur cet utilisateur avec d'autres utilisateurs, nous devons donc le retirer de la réponse json nous avons donc une boucle for où nous retirons l'objet utilisateur du todo, supprimons l'email et le nom d'utilisateur de la json, puis le remettons dans le todo c'est pratique pour supprimer des données sensibles d'un appel d'api dans des situations où vous ne pouvez pas contrôler quels champs vous renvoyez comme un objet utilisateur inclus dans ce cas, nous n'en avons pas vraiment besoin car cette fonction ne renverra que les todos que vous avez créés vous même nous faisons cela en utilisant currentuser à nouveau pour interroger uniquement les todos créés par le currentuser qui était attaché à la requête les résultats sont renvoyés dans l'ordre décroissant afin que les derniers todos apparaissent en premier lorsque vous devez charger paresseusement un autre lot de todos, vous prenez la date createdat du dernier todo et l'utilisez comme paramètre de date pour la prochaine requête parse server 3 x 1 parse cloud define("gettodosforuser", async(request) => { 2 let currentuser = request user; 3 let date = request params date; 4 let query = new parse query("todo"); 5 query equalto("user", currentuser); 6 query lessthan("createdat", date); 7 query descending("createdat"); 8 query limit(100); 9 query include("user"); 10 let results = await query find({ usemasterkey true }); 11 if(results length === 0) throw new error('no results found!'); 12 13 let resultsarray = \[]; 14 for (let i = 0; i < results length; i++) { 15 let todo = results\[i]; 16 let tempuser = todo get("user"); 17 let jsonuser = tempuser tojson(); 18 delete jsonuser email; 19 delete jsonuser username; 20 21 jsonuser type = "object"; 22 jsonuser classname = " user"; 23 24 let cleanedtodo = todo tojson(); 25 cleanedtodo user = jsonuser; 26 cleanedtodo type = "object"; 27 cleanedtodo classname = "todo"; 28 resultsarray push(cleanedtodo); 29 } 30 return resultsarray; 31 }); parse server 2 x 1 parse cloud define("gettodosforuser", function(request, response) { 2 var currentuser = request user; 3 var date = request params date; 4 var query = new parse query("todo"); 5 query equalto("user", currentuser); 6 query lessthan("createdat", date); 7 query descending("createdat"); 8 query limit(100); 9 query include("user"); 10 query find({ 11 usemasterkey true, 12 success function (results) { 13 var resultsarray = \[]; 14 for (var i = 0; i < results length; i++) { 15 var todo = results\[i]; 16 var tempuser = todo get("user"); 17 var jsonuser = tempuser tojson(); 18 delete jsonuser email; 19 delete jsonuser username; 20 21 jsonuser type = "object"; 22 jsonuser classname = " user"; 23 24 var cleanedtodo = todo tojson(); 25 cleanedtodo user = jsonuser; 26 cleanedtodo type = "object"; 27 cleanedtodo classname = "todo"; 28 resultsarray push(cleanedtodo); 29 } 30 response success(resultsarray); 31 }, 32 error function (error) { 33 response error(" error " + error code + " " + error message); 34 } 35 }); 36 }); 9 maintenant que nous avons les todos, nous pouvons les voir dans l'application et les marquer comme complétés si nous le souhaitons couvrons cela ensuite 10 pour marquer un todo comme complété, il suffit d'appuyer sur le bouton ‘marquer comme complété’ sur l'un des todos que vous avez créés cela déclenchera une méthode dans le todocontroller swift appelée ‘marktodosascompletedfor’ qui prend le todo que vous avez sélectionné comme paramètre il envoie l'identifiant de l'objet todo au serveur en tant que paramètre, puis renvoie le todo mis à jour en résultat todocontroller swift 1 func marktodosascompletedfor(todo\ todo, completion @escaping ( result bool, message\ string, todoarray \[todo]) >()){ 2 var resulttodoarray \[todo] = \[] 3 let cloudparams \[anyhashable\ any] = \["todoid"\ todo objectid ?? ""] 4 pfcloud callfunction(inbackground marktodoascompletedforuser, withparameters cloudparams, block { 5 (result any?, error error?) > void in 6 if error != nil { 7 if let descrip = error? localizeddescription{ 8 completion(false, descrip, resulttodoarray) 9 } 10 }else{ 11 resulttodoarray = result as! \[todo] 12 completion(true, "success", resulttodoarray) 13 } 14 }) 15 } 11\ maintenant, nous allons écrire le code cloud pour mettre à jour cette tâche il recherche la tâche à mettre à jour en fonction de l'objectid, mais il utilise également l'utilisateur actuel pour s'assurer que la tâche associée à l'objectid a été créée par l'utilisateur effectuant la requête cela garantit que vous ne pouvez voir que les tâches que vous avez créées et est donc sécurisé nous incluons une limite de 1 résultat pour nous assurer que le serveur ne continue pas à chercher après avoir trouvé la tâche il existe une autre méthode pour trouver un objet en fonction d'un objectid, mais je n'aime pas l'utiliser car elle peut renvoyer des résultats étranges si elle ne trouve pas l'objet associé à l'objectid nous définissons également la 'finisheddate' avec la date actuelle lorsque l'objet a été mis à jour en ayant la finisheddate définie uniquement par cette fonction, nous avons veillé à ce que la finisheddate soit sécurisée et ne puisse pas être falsifiée ou modifiée nous avons également utilisé 'query equalto("finished", false)' pour nous assurer qu'une tâche inachevée peut être marquée comme terminée et avoir la finisheddate définie cela signifie qu'une fois qu'une tâche a été marquée comme terminée, elle ne peut jamais être marquée comme terminée à une date ultérieure parse server 3 x 1 parse cloud define("marktodoascompletedforuser", async(request) => { 2 let currentuser = request user; 3 let todoid = request params todoid; 4 let query = new parse query("todo"); 5 query equalto("user", currentuser); 6 query equalto("objectid", todoid); 7 query equalto("finished", false); 8 let todo = await query first({ usemasterkey true }); 9 if(object keys(todo) length === 0) throw new error('no results found!'); 10 todo set("finished", true); 11 let date = new date(); 12 todo set("finisheddate", date); 13 try { 14 await todo save(null, { usemasterkey true}); 15 return todo; 16 } catch (error){ 17 return("getnewstore error " + error code + " " + error message); 18 } 19 }); parse server 2 x 1 parse cloud define("marktodoascompletedforuser", function(request, response) { 2 var currentuser = request user; 3 var todoid = request params todoid; 4 var query = new parse query("todo"); 5 query equalto("user", currentuser); 6 query equalto("objectid", todoid); 7 query equalto("finished", false); 8 query limit(1); 9 query find({ 10 usemasterkey true, 11 success function (results) { 12 if (results length > 0) { 13 var todo = results\[0]; 14 todo set("finished", true); 15 var date = new date(); 16 todo set("finisheddate", date); 17 todo save(null, { 18 usemasterkey true, 19 success function (object) { 20 response success(\[todo]); 21 }, 22 error function (object, error) { 23 response error("got an error " + error code + " " + error description); 24 } 25 }); 26 } else { 27 response error("todo not found to update"); 28 } 29 30 }, 31 error function (error) { 32 response error(" error " + error code + " " + error message); 33 } 34 }); 35 }); 7\) conclusion ! et c'est tout vous avez construit une application de tâches sécurisée encore une fois, la clé pour créer une application sécurisée sur le serveur parse est de désactiver toutes les autorisations au niveau des classes pour toutes les classes sauf pour la classe utilisateur sur la classe utilisateur, vous désactivez toutes les autorisations sauf créer et obtenir assurez vous également de définir tous les acl des utilisateurs afin que l'utilisateur ne puisse obtenir que ses propres données ensuite, toutes vos interactions passent par le code cloud et sont filtrées en utilisant request user, alias l'utilisateuractuel voilà, vous pouvez maintenant construire des systèmes sécurisés sur le serveur parse et back4app mais attendez vous dites ? qu'en est il des travaux en arrière plan et des requêtes en direct ? eh bien, vous avez un bon point, donc je vais couvrir cela dans deux sections bonus ensuite 8\) sections bonus 1\ travaux en arrière plan parfois vous devez créer un travail en arrière plan qui s'exécute toutes les heures, ou tous les jours ou toutes les semaines si vous exécutez avec toutes vos autorisations au niveau des classes désactivées, votre travail en arrière plan ne pourra pas interroger la base de données à moins qu'il ne soit configuré correctement c'est un peu délicat à faire, donc je veux inclure un exemple ici dans ce cas, nous allons créer un travail en arrière plan qui vérifie la base de données pour les tâches non terminées qui ont plus d'un an et les marque automatiquement comme terminées le truc ici est d'utiliser 'usemasterkey' correctement il doit être ajouté à la requête avant la promesse then suivez simplement ce modèle et vous devriez être en mesure d'écrire facilement des travaux en arrière plan sécurisés vous commencez toujours par écrire une requête que vous souhaitez itérer sur l'ensemble de la base de données et ensuite assurez vous d'inclure status error s'il y a une erreur et terminez le avec status success pour vous assurer qu'il se termine vous pouvez regarder les journaux sur back4app pour voir le travail en arrière plan fonctionner pendant que vous l'exécutez parse server 3 x 1 parse cloud job("markunfinishedtodosolderthan1yearasfinished", async(request) => { 2 let date = new date(); 3 let intyear = date getfullyear() 1; 4 let query = new parse query("todo"); 5 query equalto("finished", intyear); 6 query lessthan("createdat", date); 7 8 let todo = await query find({ usemasterkey true }); 9 for (let i = 0; i < results length; i++) { 10 let todo = results\[i]; 11 todo set("finished", true); 12 todo set("finisheddate", date); 13 try { 14 await todo save(null, { usemasterkey true}); 15 } catch (error){ 16 console log("getnewstore error " + error code + " " + error message); 17 } 18 } 19 return "migration completed successfully "; 20 }); parse server 2 x 1 parse cloud define("marktodoascompletedforuser", function(request, response) { 2 var currentuser = request user; 3 var todoid = request params todoid; 4 var query = new parse query("todo"); 5 query equalto("user", currentuser); 6 query equalto("objectid", todoid); 7 query equalto("finished", false); 8 query limit(1); 9 query find({ 10 usemasterkey true, 11 success function (results) { 12 if (results length > 0) { 13 var todo = results\[0]; 14 todo set("finished", true); 15 var date = new date(); 16 todo set("finisheddate", date); 17 todo save(null, { 18 usemasterkey true, 19 success function (object) { 20 response success(\[todo]); 21 }, 22 error function (object, error) { 23 response error("got an error " + error code + " " + error description); 24 } 25 }); 26 } else { 27 response error("todo not found to update"); 28 } 29 30 }, 31 error function (error) { 32 response error(" error " + error code + " " + error message); 33 } 34 }); 35 }); 2 requêtes en direct parfois vous devez utiliser la fonctionnalité de requête en direct de parse pour quelque chose comme une application de chat en direct vous voudrez utiliser la requête en direct pour voir quand de nouveaux messages pour votre utilisateur sont créés la requête en direct est essentiellement la façon dont parse utilise des sockets pour obtenir des mises à jour en temps réel c'est assez pratique mais cela ne fonctionnera pas avec une classe dont les permissions find ont été désactivées donc, dans ce cas, nous allons réactiver les permissions find pour la classe message et à la place, nous allons attribuer des acl pour ce message directement l'acl doit être définie de sorte que seul le destinataire puisse utiliser un find pour obtenir le message du serveur ensuite, vous exécutez votre requête en direct pf dans votre client à la recherche de messages pour votre utilisateur et cela fonctionnera parfaitement si vous traitez des messages de groupe, c'est un peu différent vous pouvez attribuer plusieurs personnes à l'acl mais cela ne s'échelonne vraiment pas au lieu de cela, il y a une meilleure façon vous définissez l'acl en fonction d'un rôle parse role et ensuite tout utilisateur que vous souhaitez avoir accès à ce message, vous l'attribuez simplement à ce parse role si vous voulez les empêcher de lire les messages pour ce groupe, vous les retirez de ce rôle c'est beaucoup plus facile que de les retirer de l'acl de chaque message et cela s'échelonne pour des groupes très larges c'est la bonne façon de faire je ne vais pas laisser un exemple de code pour cela car c'est trop complexe pour ce tutoriel, mais peut être que j'expliquerai comment le faire dans le prochain merci d'avoir lu ce tutoriel sur la sécurité avec parse et back4app si vous avez des questions, n'hésitez pas à me contacter et je serai heureux d'y répondre merci ! joren