Compartir vía


Llamada a una API web en una aplicación web de Node.js

Se aplica a:Círculo blanco con un símbolo X gris. inquilinos de personal Círculo verde con un símbolo de marca de verificación blanca. 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

Actualización del código

  1. 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 o deleteToDogetToDos controlan la lógica real para manipular el recurso. Estas funciones se definen en el archivo controller/todolistController.js .

  2. 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ón callEndpointWithToken se define en el archivo fetch.js. Por ejemplo, para crear un recurso en la API, la función postToDo pasa un punto de conexión, un token de acceso, un método HTTP y un cuerpo de solicitud a la función callEndpointWithToken y espera una respuesta. A continuación, redirige al usuario a la vista todo.hbs para mostrar todas las tareas.

  3. 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}`,
        }        
        //...
    
  4. 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.

  5. En el editor de código, abra el archivo app.js y, a continuación:

    1. Agregue el enrutador de tareas pendientes con el código siguiente:

          var todosRouter = require('./routes/todos');
      
    2. 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:

  1. 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.

  2. 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-appy, a continuación, ejecute el siguiente comando:

    npm start
    

    Se inicia la aplicación web cliente.

  3. 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: