Appeler une API web dans une application web Node.js
S’applique à : Locataires de main-d’œuvre Locataires externes (en savoir plus)
Dans cet article, vous allez apprendre à appeler l’API web à partir de votre application web cliente Node.js en utilisant le jeton d’accès que vous avez acquis dans Acquérir un jeton d’accès. L’API web est protégée par ID externe Microsoft Entra. Cet article est la quatrième et dernière partie d’une série de guides en quatre parties.
Prérequis
- Suivez les étapes décrites dans la première partie de cette série de guides, Préparer un locataire externe à appeler une API dans une application web Node.js.
- Suivez les étapes de la deuxième partie de cette série de guides, Préparer l’application pour appeler une API dans une application web Node.js.
- Effectuez les étapes décrites dans la troisième partie de cette série de guides Acquérir un jeton d’accès dans votre article sur l’application web Node.js.
Mettre à jour le code
Dans votre éditeur de code, ouvrez le fichier routes/todos.js et ajoutez le code suivant :
const express = require('express'); const router = express.Router(); const toDoListController = require('../controller/todolistController'); const authProvider = require('../auth/AuthProvider'); const { protectedResources } = require('../authConfig'); // custom middleware to check auth state function isAuthenticated(req, res, next) { if (!req.session.isAuthenticated) { return res.redirect('/auth/signin'); // redirect to sign-in route } next(); } // isAuthenticated checks if user is authenticated router.get('/',isAuthenticated, authProvider.getToken(protectedResources.toDoListAPI.scopes.read),toDoListController.getToDos); router.delete('/', isAuthenticated,authProvider.getToken(protectedResources.toDoListAPI.scopes.write),toDoListController.deleteToDo); router.post('/',isAuthenticated,authProvider.getToken(protectedResources.toDoListAPI.scopes.write),toDoListController.postToDo); module.exports = router;
Ce fichier contient des routes express pour créer, lire et supprimer des ressources dans l’API protégée. Chaque route utilise trois fonctions de middleware, qui s’exécutent dans cet ordre :
isAuthenticated
vérifie que l’utilisateur est authentifié.getToken
demande un jeton d’accès. Vous avez défini cette fonction précédemment dans Acquérir un jeton d’accès. Par exemple, la route de création de ressources (requête POST) demande un jeton d’accès avec des autorisations en lecture et en écriture.Enfin, les méthodes
postToDo
oudeleteToDo
getToDos
gèrent la logique réelle de manipulation de la ressource. Ces fonctions sont définies dans le fichier controller/todolistController.js.
Dans votre éditeur de code, ouvrez le fichier controller/todolistController.js et ajoutez le code suivant :
const { callEndpointWithToken } = require('../fetch'); const { protectedResources } = require('../authConfig'); exports.getToDos = async (req, res, next) => { try { const todoResponse = await callEndpointWithToken( protectedResources.toDoListAPI.endpoint, req.session.accessToken, 'GET' ); res.render('todos', { isAuthenticated: req.session.isAuthenticated, todos: todoResponse.data }); } catch (error) { next(error); } }; exports.postToDo = async (req, res, next) => { try { if (!!req.body.description) { let todoItem = { description: req.body.description, }; await callEndpointWithToken( protectedResources.toDoListAPI.endpoint, req.session.accessToken, 'POST', todoItem ); res.redirect('todos'); } else { throw { error: 'empty request' }; } } catch (error) { next(error); } }; exports.deleteToDo = async (req, res, next) => { try { await callEndpointWithToken( protectedResources.toDoListAPI.endpoint, req.session.accessToken, 'DELETE', req.body._id ); res.redirect('todos'); } catch (error) { next(error); } };
Chacune de ces fonctions collecte toutes les informations requises pour appeler une API. Elle délègue ensuite le travail à la fonction
callEndpointWithToken
et attend une réponse. La fonctioncallEndpointWithToken
est définie dans le fichier fetch.js. Par exemple, pour créer une ressource dans l’API, la fonctionpostToDo
passe un point de terminaison, un jeton d’accès, une méthode HTTP et un corps de requête à la fonctioncallEndpointWithToken
et attend une réponse. Elle redirige ensuite l’utilisateur vers la vue todo.hbs pour afficher toutes les tâches.Dans votre éditeur de code, ouvrez le fichier fetch.js et ajoutez le code suivant :
const axios = require('axios'); /** * Makes an Authorization "Bearer" request with the given accessToken to the given endpoint. * @param endpoint * @param accessToken * @param method */ const callEndpointWithToken = async (endpoint, accessToken, method, data = null) => { const options = { headers: { Authorization: `Bearer ${accessToken}`, }, }; switch (method) { case 'GET': return await axios.get(endpoint, options); case 'POST': return await axios.post(endpoint, data, options); case 'DELETE': return await axios.delete(endpoint + `/${data}`, options); default: return null; } }; module.exports = { callEndpointWithToken, };
Cette fonction effectue l’appel d’API en question. Notez comment vous incluez le jeton d’accès en tant que valeur du jeton du porteur dans l’en-tête de la requête HTTP :
//... headers: { Authorization: `Bearer ${accessToken}`, } //...
Dans votre éditeur de code, ouvrez le fichier .env et ajoutez la configuration suivante :
# Use this variable only in the development environment. # Please remove the variable when you move the app to the production environment. NODE_TLS_REJECT_UNAUTHORIZED='0'
Le paramètre
NODE_TLS_REJECT_UNAUTHORIZED='0'
de votre fichier .env indique Node.js d’ignorer les erreurs de certificat SSL, telles que l’erreur de certificat auto-signé.Dans votre éditeur de code, ouvrez le fichier
app.js
, puis :Ajoutez le routeur todo en utilisant le code suivant :
var todosRouter = require('./routes/todos');
Utilisez le routeur todo en utilisant le code suivant :
app.use('/todos', todosRouter);
Exécuter et tester l’application web et l’API
À ce stade, vous êtes prêt à appeler l’API web à partir de l’application web cliente :
Utilisez les étapes dans l’article Sécuriser une API web ASP.NET pour démarrer votre application API web. Votre API web est maintenant prête à traiter les requêtes clientes.
Dans votre terminal, vérifiez que vous êtes dans le dossier du projet contenant votre application web cliente, par exemple
ciam-sign-in-call-api-node-express-web-app
, puis exécutez la commande suivante :npm start
Votre application web cliente démarre.
Suivez les étapes décrites dans Exécuter et tester l’exemple d’application web et l’API pour montrer comment l’application cliente appelle l’API web.
Étapes suivantes
Vous voudrez peut-être :