Compartir a través de


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, 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

Actualización del código

  1. 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 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 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. La callEndpointWithToken función se define en el archivo fetch.js . Por ejemplo, para crear un recurso en la API, la postToDo función pasa un punto de conexión, un token de acceso, un método HTTP y un cuerpo de solicitud a la callEndpointWithToken función 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 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}`,
        }        
        //...
    
  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 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.

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

    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, está listo para llamar a la API web desde la aplicación web cliente:

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

  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 de ejemplo y la API para demostrar cómo la aplicación cliente llama a la API web.

Puede que desee: