Вызов веб-API в веб-приложении Node.js
Область применения: клиенты рабочей силы внешние
клиенты (дополнительные сведения)
Из этой статьи вы узнаете, как вызвать веб-API из клиентского веб-приложения Node.js с помощью маркера доступа, полученного в маркере получения доступа. Веб-API защищен Внешняя идентификация Microsoft Entra. Эта статья является четвертой и последней частью серии четырех частей руководства.
Предварительные требования
- Выполните действия, описанные в первой части этой серии руководств, подготовьте внешний клиент для вызова API в веб-приложении Node.js.
- Выполните действия во второй части этой серии руководств, подготовьте приложение для вызова API в веб-приложении Node.js.
- Выполните действия, описанные в третьей части этой серии руководств, получение маркера доступа в статье Node.js веб-приложения .
Обновление кода
В редакторе кода откройте файл маршрутов или 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 .
В редакторе кода откройте файл контроллера или 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 , чтобы отобразить все задачи.В редакторе кода откройте файл 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}`, } //...
В редакторе кода откройте 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-сертификата, такие как ошибка самозаверяющего сертификата.В редакторе
app.js
кода откройте файл, а затем:Добавьте маршрутизатор todo с помощью следующего кода:
var todosRouter = require('./routes/todos');
Используйте маршрутизатор todo с помощью следующего кода:
app.use('/todos', todosRouter);
Запуск и тестирование веб-приложения и API
На этом этапе вы готовы вызвать веб-API из клиентского веб-приложения:
Чтобы запустить веб-приложение API, выполните действия, описанные в статье "Защита ASP.NET веб-API ". Веб-API теперь готов обслуживать клиентские запросы.
В терминале убедитесь, что вы находитесь в папке проекта, содержащей клиентское веб-приложение, например
ciam-sign-in-call-api-node-express-web-app
, и выполните следующую команду:npm start
Запускается клиентское веб-приложение.
Выполните действия, описанные в разделе "Запуск и тестирование примера веб-приложения и API ", чтобы продемонстрировать, как клиентское приложение вызывает веб-API.
Следующие шаги
Возможно, вам потребуется: