Anropa ett webb-API i ett Node.js webbprogram
Gäller för: Personalklientorganisationer Externa klienter (läs mer)
I den här artikeln får du lära dig hur du anropar ett webb-API från din Node.js-klientwebbapp med hjälp av åtkomsttoken som du skaffar i Hämta åtkomsttoken. Webb-API:et skyddas av Microsoft Entras externa ID. Den här artikeln är den fjärde och sista delen i en guideserie i fyra delar.
Förutsättningar
- Slutför stegen i den första delen av den här guideserien Förbered extern klientorganisation för att anropa ett API i en Node.js webbapp.
- Slutför stegen i den andra delen av den här guideserien, Förbered appen för att anropa ett API i en Node.js webbapp.
- Slutför stegen i den tredje delen av den här guideserien Hämta en åtkomsttoken i din Node.js webbappartikel .
Uppdatera kod
Öppna vägar/todos.js i kodredigeraren och lägg sedan till följande kod:
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;
Den här filen innehåller expressvägar för att skapa, läsa och ta bort resursen i det skyddade API:et. Varje väg använder tre mellanprogramsfunktioner som körs i den sekvensen:
isAuthenticated
kontrollerar om användaren är autentiserad.getToken
begär en åtkomsttoken. Du definierade den här funktionen tidigare i Hämta åtkomsttoken. Till exempel begär POST-begäran (create resource route) en åtkomsttoken med läs- och skrivbehörighet.Slutligen
postToDo
hanterar metoderna ellerdeleteToDo
getToDos
den faktiska logiken för att manipulera resursen. Dessa funktioner definieras i styrenhet/todolistController.js fil.
Öppna kontrollanten/todolistController.js i kodredigeraren och lägg sedan till följande kod:
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); } };
Var och en av dessa funktioner samlar in all information som krävs för att anropa ett API. Sedan delegeras arbetet till
callEndpointWithToken
funktionen och väntar på ett svar. FunktionencallEndpointWithToken
definieras i filen fetch.js . Om du till exempel vill skapa en resurs i API:etpostToDo
skickar funktionen en slutpunkt, en åtkomsttoken, en HTTP-metod och en begärandetext tillcallEndpointWithToken
funktionen och väntar på ett svar. Användaren omdirigeras sedan till vyn todo.hbs för att visa alla uppgifter.Öppna fetch.js fil i kodredigeraren och lägg sedan till följande kod:
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, };
Den här funktionen gör det faktiska API-anropet. Observera hur du inkluderar åtkomsttoken som värdet för ägartoken i HTTP-begärandehuvudet:
//... headers: { Authorization: `Bearer ${accessToken}`, } //...
Öppna .env-filen i kodredigeraren och lägg sedan till följande konfiguration:
# 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'
Inställningen
NODE_TLS_REJECT_UNAUTHORIZED='0'
i .env-filen instruerar Node.js att ignorera eventuella SSL-certifikatfel, till exempel det självsignerade certifikatfelet.Öppna filen i kodredigeraren
app.js
och sedan:Lägg till todo-routern med hjälp av följande kod:
var todosRouter = require('./routes/todos');
Använd att göra-routern med hjälp av följande kod:
app.use('/todos', todosRouter);
Köra och testa webbapp och API
Nu är du redo att anropa webb-API:et från klientwebbappen:
Använd stegen i artikeln Skydda en ASP.NET webb-API för att starta webb-API-appen. Webb-API:et är nu redo att hantera klientbegäranden.
I terminalen kontrollerar du att du är i projektmappen som innehåller klientwebbappen,
ciam-sign-in-call-api-node-express-web-app
till exempel , och kör sedan följande kommando:npm start
Klientwebbappen startar.
Använd stegen i Kör och testa exempelwebbappen och API :et för att visa hur klientappen anropar webb-API:et.
Nästa steg
Du kanske vill: