Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a: inquilinos de personal
inquilinos externos (más información)
En este artículo, aprenderá a llamar a una API web desde la aplicación web cliente de Node.js mediante el token de acceso que adquiere en Acquire access token (Adquirir token de acceso). La API web está protegida por el identificador externo de Microsoft Entra. Este artículo es la cuarta y última parte de una serie de guías de cuatro partes.
Prerrequisito
- 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: Preparar la aplicación para llamar a una API en una aplicación web de Node.js.
- Completa los pasos de la tercera parte de esta serie de guías en el artículo Adquirir un token de acceso en la aplicación web Node.js.
Actualización del código
En el editor de código, abra el archivo routes/todos.js y agregue el código siguiente:
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 en 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 Acquire access token (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
postToDo
métodos 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 código siguiente:
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 a la
callEndpointWithToken
función y espera una respuesta. LacallEndpointWithToken
función se define en el archivo fetch.js . Por ejemplo, para crear un recurso en la API, lapostToDo
función pasa un punto de conexión, un token de acceso, un método HTTP y un cuerpo de solicitud a lacallEndpointWithToken
función 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 real a la API. Observa cómo se incluye el token de acceso como el valor del token 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
NODE_TLS_REJECT_UNAUTHORIZED='0'
configuración del 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
app.js
archivo y, a continuación, haga lo siguiente: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, está listo para llamar a la API web desde la aplicación web cliente:
Siga los pasos descritos en el artículo Protección de una API web de ASP.NET para iniciar la aplicación de 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 de ejemplo y la API para demostrar cómo la aplicación cliente llama a la API web.
Contenido relacionado
Puede que desee: