Ajouter l'entité suivante :
User : contient un champ username et un champ password
Person appartient à un UserUser dispose de plusieurs PersonGroup appartient à un UserUser dispose de plusieurs GroupAjouter au serveur HTTP la gestion des routes suivantes pour la gestion des utilisateurs :
GET /user : renvoie l'ensemble des utilisateurs sous la forme d'un tableau d'objets en JSONGET /user/:user_id : renvoie l'utilisateur d'identifiant user_id sous la forme d'un objet en JSONPOST /user/signup : ajoute une nouvelle entité User en base à partir des données fournies en JSON
username uniquehashSync fournie par le module bcryptgenerate_hash dans l'objet modèle User qui prend une chaîne et retourne la chaîne hachéePOST /user/signin : si le couple (username, password) soumis est correct, renvoie un objet JSON contenant d'une part l'utilisateur identifié et d'autre part un JSONWebToken encapsulant l'id de cet utilisateur
check_password dans le prototype de l'objet modèle User qui prend une chaîne et renvoie vrai si elle correspond au mot de passe de l'utilisateur (utiliser la méthode compareSync du module bcrypt)jsonwebtoken pour générer le JSONWebToken (méthode sign)Dans toutes les méthodes retournant des User, on fera en sorte que l'attribut password ne fasse pas partie des données renvoyées. Pour cela, on pourra surcharger la méthode toJSON en en écrivant une nouvelle version dans le prototype de l'objet modèle User.
Une fois un JWT obtenu, le client pourra le transmettre systématiquement au serveur avec chacune de ses requêtes au sein d'un header Authorization dont le contenu sera de la forme : Bearer [token-value].
À chaque requête, le serveur pourra donc vérifier la validité du JWT fourni et le déchiffrer afin de connaître l'id de l'utilisateur se trouvant derrière ce client.
Les routes de notre application pour lesquelles on souhaite connaître l'identité du client vont donc devoir toutes passer par un ou plusieurs middlewares dont l'objectif sera de charger une instance de User correspondant au client identifié au sein de l'objet représentant la requête courante (req) sous le nom user.
On utilisera tout d'abord le module express-jwt qui fournit un middleware qui va se charger de décoder le JWT fourni et d'enregistrer l'objet qui y est encapsulé au sein de la variable req.user.
Comme on n'a enregistré dans le JWT que l'id de l'utilisateur et que l'on souhaite avoir une instance complète du User correspondant, on va rajouter un deuxième middleware qui va faire une requête en base de données et remplacer la variable req.user par l'instance récupérée.
Rajouter ensuite les routes suivantes :
PUT /user/:user_id : modifie l'utilisateur d'identifiant user_id à partir des données fournies en JSON
DELETE /user/:user_id : supprime l'utilisateur d'identifiant user_id
Modifier l'ensemble des routes déjà écrites afin de toujours d'abord charger l'identité du client faisant la requête.
Dans les middlewares qui récupèrent une Person ou un Group on pourra maintenant profiter des méthodes getPeople et getGroups de req.user afin de se restreindre aux entités appartenant à l'utilisateur en question.
Les seules routes publiques restantes sont les 4 que l'on a définies au début de ce sujet.