Chamar uma API da Web em um aplicativo Web Node.js
Aplica-se a: Locatários da força de trabalho Locatários externos (saiba mais)
Neste artigo, você aprenderá a chamar uma API da Web do seu aplicativo Web cliente Node.js usando o token de acesso adquirido em Adquirir token de acesso. A API da Web é protegida pelo ID Externo do Microsoft Entra. Este artigo é a quarta e última parte de uma série de guias em quatro partes.
Pré-requisito
- Conclua as etapas na primeira parte desta série de guias, Preparar locatário externo para chamar uma API em um aplicativo Web Node.js.
- Conclua as etapas na segunda parte desta série de guias, Preparar aplicativo para chamar uma API em um aplicativo Web Node.js.
- Conclua as etapas na terceira parte desta série de guias Adquira um token de acesso no artigo do aplicativo Web Node.js.
Atualizar código
No editor de códigos, abra o arquivo routes/todos.js e adicione o seguinte 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 arquivo contém rotas expressas para criar, ler e excluir recursos na API protegida. Cada rota usa três funções de middleware, que são executadas nessa sequência:
isAuthenticated
Verifica se o usuário está autenticado.getToken
Solicita um token de acesso. Você definiu essa função anteriormente em Adquirir token de acesso. Por exemplo, a rota de criação de recursos (solicitação POST) solicita um token de acesso com permissões de leitura e gravação.Finalmente, os
postToDo
métodos ordeleteToDo
getToDos
manipulam a lógica real para manipular o recurso. Essas funções são definidas no arquivo controlador/todolistController.js .
No editor de códigos, abra o arquivo controller/todolistController.js e adicione o seguinte 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 uma dessas funções coleta todas as informações necessárias para chamar uma API. Em seguida, delega o trabalho à
callEndpointWithToken
função e aguarda uma resposta. AcallEndpointWithToken
função é definida no arquivo fetch.js . Por exemplo, para criar um recurso na API, apostToDo
função passa um ponto de extremidade, um token de acesso, um método HTTP e um corpo de solicitação para acallEndpointWithToken
função e aguarda uma resposta. Em seguida, redireciona o usuário para a visualização todo.hbs para mostrar todas as tarefas.No editor de códigos, abra fetch.js arquivo e adicione o seguinte 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 função faz a chamada de API real. Observe como você inclui o token de acesso como o valor do token de portador no cabeçalho da solicitação HTTP:
//... headers: { Authorization: `Bearer ${accessToken}`, } //...
No editor de códigos, abra o arquivo .env e adicione a seguinte configuração:
# 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'
A
NODE_TLS_REJECT_UNAUTHORIZED='0'
configuração no arquivo .env instrui Node.js a ignorar quaisquer erros de certificado SSL, como o erro de certificado autoassinado.No editor de códigos, abra o arquivo e, em
app.js
seguida:Adicione o roteador todo usando o seguinte código:
var todosRouter = require('./routes/todos');
Use o roteador todo usando o seguinte código:
app.use('/todos', todosRouter);
Executar e testar o aplicativo Web e a API
Neste ponto, você está pronto para chamar a API da Web do aplicativo Web cliente:
Use as etapas no artigo Proteger uma API Web ASP.NET para iniciar seu aplicativo de API Web. Sua API da Web agora está pronta para atender às solicitações dos clientes.
No terminal, verifique se você está na pasta do projeto que contém o aplicativo Web cliente, como
ciam-sign-in-call-api-node-express-web-app
, e execute o seguinte comando:npm start
Seu aplicativo Web cliente é iniciado.
Use as etapas em Executar e testar exemplo de aplicativo Web e API para demonstrar como o aplicativo cliente chama a API Web.
Próximos passos
Você pode querer: