Llamada a una API web en una aplicación web de Node.js
Se aplica a: inquilinos de personal inquilinos externos (más información)
En este artículo, se explica cómo llamar a una API web desde la aplicación web cliente de Node.js mediante el token de acceso que ha adquirido en Adquirir token de acceso. La API web está protegida por la Id. externa de Microsoft Entra. Este artículo es la cuarta y última parte de una serie de guías de cuatro partes.
Requisito previo
- Complete los pasos de la primera parte de esta serie de guías: Preparación del inquilino externo para llamar a una API en una aplicación web de Node.js.
- Complete los pasos de la segunda parte de esta serie de guías: Preparación de una aplicación para llamar a una API en una aplicación web de Node.js.
- Complete los pasos de la tercera parte de esta serie de guías: artículo Adquisición de un token de acceso en la aplicación web de Node.js.
Actualización del código
En el editor de código, abra el archivo routes/todos.js y agregue el siguiente código:
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;
Este archivo contiene rutas rápidas para crear, leer y eliminar recursos de la API protegida. Cada ruta usa tres funciones de middleware, que se ejecutan en esa secuencia:
isAuthenticated
comprueba si el usuario está autenticado.getToken
solicita un token de acceso. Ha definido esta función anteriormente en Adquirir token de acceso. Por ejemplo, la ruta de creación de recursos (solicitud POST) solicita un token de acceso con permisos de lectura y escritura.Por último, los métodos
postToDo
odeleteToDo
getToDos
controlan la lógica real para manipular el recurso. Estas funciones se definen en el archivo controller/todolistController.js .
En el editor de código, abra el archivo controller/todolistController.js y agregue el siguiente código:
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); } };
Cada una de estas funciones recopila toda la información necesaria para llamar a una API. A continuación, delega el trabajo en la función
callEndpointWithToken
y espera una respuesta. La funcióncallEndpointWithToken
se define en el archivo fetch.js. Por ejemplo, para crear un recurso en la API, la funciónpostToDo
pasa un punto de conexión, un token de acceso, un método HTTP y un cuerpo de solicitud a la funcióncallEndpointWithToken
y espera una respuesta. A continuación, redirige al usuario a la vista todo.hbs para mostrar todas las tareas.En el editor de código, abra el archivo fetch.js y agregue el siguiente código:
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, };
Esta función realiza la llamada API real. Observe cómo se incluye el token de acceso como el valor del token de portador en el encabezado de solicitud HTTP:
//... headers: { Authorization: `Bearer ${accessToken}`, } //...
En el editor de código, abra el archivo .env y agregue la siguiente configuración:
# 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'
La configuración de
NODE_TLS_REJECT_UNAUTHORIZED='0'
en el archivo .env indica a Node.js omitir los errores de certificado SSL, como el error de certificado autofirmado.En el editor de código, abra el archivo
app.js
y, a continuación:Agregue el enrutador de tareas pendientes con el código siguiente:
var todosRouter = require('./routes/todos');
Use el enrutador de tareas pendientes con el código siguiente:
app.use('/todos', todosRouter);
Ejecución y prueba de la aplicación web y la API
En este momento, ya puede llamar a la API web desde la aplicación web cliente:
Siga los pasos del artículo Protección de una API web de ASP.NET para iniciar la API web. La API web ya está lista para atender solicitudes de cliente.
En el terminal, asegúrese de que se encuentra en la carpeta del proyecto que contiene la aplicación web cliente, como
ciam-sign-in-call-api-node-express-web-app
y, a continuación, ejecute el siguiente comando:npm start
Se inicia la aplicación web cliente.
Siga los pasos descritos en Ejecución y prueba de la aplicación web y la API de ejemplo para demostrar cómo la aplicación cliente llama a la API web.
Pasos siguientes
Quizá también desea: