Поделиться через


Вызов веб-API в веб-приложении Node.js

Область применения: Белый круг с серым символом X. клиенты рабочей силы внешниеЗеленый круг с символом белой галочки. клиенты (дополнительные сведения)

Из этой статьи вы узнаете, как вызвать веб-API из клиентского веб-приложения Node.js с помощью маркера доступа, полученного в маркере получения доступа. Веб-API защищен Внешняя идентификация Microsoft Entra. Эта статья является четвертой и последней частью серии четырех частей руководства.

Предварительные требования

Обновление кода

  1. В редакторе кода откройте файл маршрутов или todos.js , а затем добавьте следующий код:

        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;
    

    Этот файл содержит экспресс-маршруты для создания, чтения и удаления ресурса в защищенном API. Каждый маршрут использует три функции ПО промежуточного слоя, которые выполняются в этой последовательности:

    • isAuthenticated проверяет, прошел ли пользователь проверку подлинности.

    • getToken запрашивает маркер доступа. Вы определили эту функцию ранее в разделе "Получение маркера доступа". Например, создание маршрута ресурсов (POST-запроса) запрашивает маркер доступа с разрешениями на чтение и запись.

    • Наконец, postToDo методы обрабатывают deleteToDo getToDos фактическую логику для управления ресурсом. Эти функции определены в файле контроллера или todolistController.js .

  2. В редакторе кода откройте файл контроллера или todolistController.js , а затем добавьте следующий код:

        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);
            }
        };
    

    Каждая из этих функций собирает все сведения, необходимые для вызова API. Затем он делегирует работу callEndpointWithToken функции и ожидает ответа. Функция callEndpointWithToken определена в файле fetch.js . Например, чтобы создать ресурс в API, postToDo функция передает конечную точку, маркер доступа, метод HTTP и текст callEndpointWithToken запроса функции и ожидает ответа. Затем он перенаправляет пользователя в представление todo.hbs , чтобы отобразить все задачи.

  3. В редакторе кода откройте файл fetch.js , а затем добавьте следующий код:

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

    Эта функция делает фактический вызов API. Обратите внимание, что маркер доступа включается в качестве значения маркера носителя в заголовке HTTP-запроса:

        //...        
        headers: {
            Authorization: `Bearer ${accessToken}`,
        }        
        //...
    
  4. В редакторе кода откройте ENV-файл и добавьте следующую конфигурацию:

        # 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'
    

    Параметр NODE_TLS_REJECT_UNAUTHORIZED='0' в env-файле указывает Node.js игнорировать ошибки SSL-сертификата, такие как ошибка самозаверяющего сертификата.

  5. В редакторе app.js кода откройте файл, а затем:

    1. Добавьте маршрутизатор todo с помощью следующего кода:

          var todosRouter = require('./routes/todos');
      
    2. Используйте маршрутизатор todo с помощью следующего кода:

          app.use('/todos', todosRouter); 
      

Запуск и тестирование веб-приложения и API

На этом этапе вы готовы вызвать веб-API из клиентского веб-приложения:

  1. Чтобы запустить веб-приложение API, выполните действия, описанные в статье "Защита ASP.NET веб-API ". Веб-API теперь готов обслуживать клиентские запросы.

  2. В терминале убедитесь, что вы находитесь в папке проекта, содержащей клиентское веб-приложение, например ciam-sign-in-call-api-node-express-web-app, и выполните следующую команду:

    npm start
    

    Запускается клиентское веб-приложение.

  3. Выполните действия, описанные в разделе "Запуск и тестирование примера веб-приложения и API ", чтобы продемонстрировать, как клиентское приложение вызывает веб-API.

Следующие шаги

Возможно, вам потребуется: