Chiamare un'API Web in un'applicazione Web Node.js
Si applica a: Tenant della forza lavoro
Tenant esterni (altre informazioni)
Questo articolo illustra come chiamare un'API Web dall'app Web del client Node.js usando il token di accesso acquisito in Acquisire il token di accesso. L'API Web è protetta da Microsoft Entra per ID esterno. Questo articolo è la quarta e ultima parte di una serie di guide in quattro parti.
Prerequisito
- Completare i passaggi della prima parte di questa serie di guide, Preparare il tenant esterno per chiamare un'API in un'applicazione Web Node.js.
- Completare i passaggi della seconda parte di questa serie di guide, Preparare l’app per chiamare un'API in un'applicazione Web Node.js.
- Completare i passaggi della terza parte di questa serie di guide Acquisire un token di accesso nell'app Web Node.js..
Aggiornare il codice
Nell'editor di codice aprire il file routes/todos.js e quindi aggiungere il codice seguente:
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;
Questo file contiene le route rapide per la creazione, la lettura e l'eliminazione di una risorsa nell'API protetta. Ogni route usa tre funzioni middleware, eseguite in tale sequenza:
isAuthenticated
controlla se l'utente è autenticato.getToken
richiede un token di accesso. Questa funzione è stata definita in precedenza in Acquisire il token di accesso. Ad esempio, la creazione della route di risorse (richiesta POST) richiede un token di accesso con autorizzazioni di lettura e scrittura.Infine, i
postToDo
metodi odeleteToDo
getToDos
gestiscono la logica effettiva per la modifica della risorsa. Queste funzioni vengono definite nel file controller/todolistController.js.
Nell'editor di codice aprire il file controller/todolistController.js, quindi aggiungere il codice seguente:
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); } };
Ognuna di queste funzioni raccoglie tutte le informazioni necessarie per chiamare un'API. Delega quindi il lavoro alla funzione
callEndpointWithToken
e attende una risposta. La funzionecallEndpointWithToken
è definita nel file fetch.js. Ad esempio, per creare una risorsa nell'API, la funzionepostToDo
passa un endpoint, un token di accesso, un metodo HTTP e un corpo della richiesta alla funzionecallEndpointWithToken
e attende una risposta. Reindirizza quindi l'utente alla visualizzazione todo.hbs per visualizzare tutte le attività.Nell'editor di codice aprire il file fetch.js e quindi aggiungere il codice seguente:
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, };
Questa funzione effettua la chiamata API effettiva. Si noti come il token di accesso viene incluso come valore del token di connessione nell'intestazione della richiesta HTTP:
//... headers: { Authorization: `Bearer ${accessToken}`, } //...
Nell'editor di codice aprire il file .env, quindi aggiungere la configurazione seguente:
# 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'
L'impostazione
NODE_TLS_REJECT_UNAUTHORIZED='0'
nel file .env indica Node.js di ignorare eventuali errori del certificato SSL, ad esempio l'errore del certificato autofirmato.Nell'editor di codice aprire il file
app.js
, quindi:Aggiungere il router delle cose da fare usando il codice seguente:
var todosRouter = require('./routes/todos');
Usare il router delle cose da fare usando il codice seguente:
app.use('/todos', todosRouter);
Eseguire e testare le app Web e API
A questo punto, è possibile chiamare l'API Web dall'app Web del client:
Usare la procedura descritta nell’articolo Proteggere un'API Web ASP.NET per avviare l'app per le API Web. L'API Web è ora pronta per gestire le richieste client.
Nel terminale assicurarsi di essere nella cartella del progetto che contiene l'app Web del client, ad esempio
ciam-sign-in-call-api-node-express-web-app
, quindi eseguire il comando seguente:npm start
Viene avviata l'app Web del client.
Usare la procedura descritta in Eseguire e testare app Web e API di esempio per illustrare come l'app del client chiama l'API Web.
Passaggi successivi
È possibile: