Implémentation de l’API Node.js (SPAs + API)
Étape 1. Définir les points de terminaison de l’API
Créer un fichier package.json
npm init. Cette commande configurera votre fichier package.json.
Vous pouvez conserver les paramètres par défaut ou les modifier selon vos besoins.
Le package.json de notre exemple ressemble à ceci :
Installer les dépendances
- express : Ce module ajoute le framework d’applications Web Express.
- cors : Ce module ajoute la prise en charge de l’activation de CORS, ce qui est nécessaire puisque l’API sera appelée à partir d’une application monopage exécutée sur un domaine différent dans un navigateur Web.
- jwks-rsa : Cette bibliothèque récupère des clés de signature RSA à partir d’un endpoint JWKS (ensemble de clés JSON Web). En utilisant
expressJwtSecret, nous pouvons générer un fournisseur de secrets qui fournira la bonne clé de signature àexpress-jwten fonction dukiddans l’en-tête du . Pour en savoir plus, consultez le dépôt GitHub node-jwks-rsa. - express-jwt : Ce module vous permet d’authentifier des requêtes HTTP à l’aide de jetons JWT dans vos applications Node.js. Il fournit plusieurs fonctions qui facilitent l’utilisation des JWT. Pour en savoir plus, consultez le dépôt GitHub express-jwt.
- body-parser : Il s’agit d’un middleware d’analyse du corps des requêtes pour Node.js. Il extrait l’intégralité du corps d’un flux de requête entrant et l’expose dans
req.bodysous une forme plus facile à utiliser. Pour en savoir plus et découvrir plusieurs solutions de rechange, consultez le dépôt GitHub de body-parser.
Implémentez les points de terminaison
server.js. Votre code doit :
- Installer les dépendances.
- Implémenter le ou les points de terminaison.
- Démarrer le serveur d’API.
node server et envoyez une requête HTTP POST à localhost:8080/timesheets. Vous devriez voir une réponse JSON contenant le message This is the POST /timesheets endpoint.
Nous avons maintenant notre point de terminaison, mais n’importe qui peut l’appeler. Passez au paragraphe suivant pour voir comment régler ce problème.
Étape 2. Sécuriser les points de terminaison de l’API
jwt, fournie par le middleware express-jwt, ainsi que jwks-rsa pour récupérer notre secret. Les bibliothèques font ce qui suit :
express-jwtdécodera le jeton et transmettra la requête, l’en-tête et le payload àjwksRsa.expressJwtSecret.jwks-rsatéléchargera ensuite toutes les clés de signature depuis le point de terminaison JWKS et vérifiera si l’une d’elles correspond aukiddans l’en-tête du JWT. Si aucune clé de signature ne correspond aukidreçu, une erreur sera générée. S’il y a correspondance, nous transmettrons la bonne clé de signature àexpress-jwt.express-jwtpoursuivra ensuite sa propre logique pour valider la signature du jeton, l’expiration,audienceet l’émetteur.
- Créer la fonction middleware pour valider le .
- Activer l’utilisation du middleware dans nos routes.
localhost:8080/timesheets, nous devrions obtenir le message d’erreur Missing or invalid token (ce qui est tout à fait normal, puisque nous n’avons pas envoyé de jeton d’accès dans notre requête).
Pour tester aussi le cas où tout fonctionne, nous devons :
- Obtenir un Jeton d’accès. Pour savoir comment faire, consultez : Obtenir un Jeton d’accès.
- Appeler l’API en ajoutant à notre requête un en-tête
Authorizationavec la valeurBearer ACCESS_TOKEN(oùACCESS_TOKENest la valeur du jeton récupéré à la première étape).
Étape 3. Vérifier les autorisations de l’application
scope) nécessaires pour utiliser notre point de terminaison et créer une feuille de temps. Plus précisément, nous voulons nous assurer que le jeton contient le bon scope, soit batch:upload.
Pour ce faire, nous utiliserons le package Node.js express-jwt-authz. Ajoutez-le donc à votre projet :
jwtAuthz(...) à votre middleware pour vous assurer que le JWT contient le scope requis afin d’exécuter un point de terminaison donné.
Nous allons ajouter une dépendance supplémentaire. La bibliothèque express-jwt-authz, utilisée conjointement avec express-jwt, valide le JWT et s’assure qu’il comporte les autorisations appropriées pour appeler le point de terminaison souhaité. Pour en savoir plus, consultez le dépôt GitHub d’express-jwt-authz.
Voici notre implémentation d’exemple (une partie du code est omise par souci de concision) :
403. Vous pouvez le tester en supprimant ce scope de votre API.
Étape 4. Déterminer l’identité de l’utilisateur
express-jwt utilisé pour valider le JWT définit également req.auth avec les informations contenues dans le JWT. Si vous voulez utiliser la revendication sub pour identifier l’utilisateur de manière unique, vous pouvez simplement utiliser req.auth.sub.
Dans le cas de l’application de feuilles de temps, cependant, nous voulons utiliser l’adresse de courriel de l’utilisateur comme identifiant unique.
La première chose à faire est d’écrire une Rule qui ajoutera l’adresse de courriel de l’utilisateur au Jeton d’accès. Accédez à la section Rules de l’Auth0 Dashboard, puis cliquez sur le bouton Create Rule.
Vous pouvez donner à la Rule un nom descriptif, par exemple Add email to Access Token, puis utiliser le code suivant pour la Rule :
namespace sert à garantir que la revendication a un nom unique et qu’elle n’entre pas en conflit avec les noms des revendications OIDC standard. Cependant, Auth0 prend en charge les revendications personnalisées avec ou sans espace de noms. Pour en savoir plus sur les revendications personnalisées, consultez Create Custom Claims.
Ensuite, dans votre API, vous pouvez récupérer la valeur de la revendication depuis req.auth et l’utiliser comme identifiant utilisateur unique que vous pouvez associer aux entrées de feuille de temps.