Dela via


Anropa ett webb-API i ett Node.js webbprogram

Gäller för:Vit cirkel med en grå X-symbol. Personalklientorganisationer Grön cirkel med en vit bockmarkeringssymbol. 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

Uppdatera kod

  1. Ö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 eller deleteToDo getToDos den faktiska logiken för att manipulera resursen. Dessa funktioner definieras i styrenhet/todolistController.js fil.

  2. Ö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. Funktionen callEndpointWithToken definieras i filen fetch.js . Om du till exempel vill skapa en resurs i API:et postToDo skickar funktionen en slutpunkt, en åtkomsttoken, en HTTP-metod och en begärandetext till callEndpointWithToken funktionen och väntar på ett svar. Användaren omdirigeras sedan till vyn todo.hbs för att visa alla uppgifter.

  3. Ö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}`,
        }        
        //...
    
  4. Ö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.

  5. Öppna filen i kodredigeraren app.js och sedan:

    1. Lägg till todo-routern med hjälp av följande kod:

          var todosRouter = require('./routes/todos');
      
    2. 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:

  1. 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.

  2. I terminalen kontrollerar du att du är i projektmappen som innehåller klientwebbappen, ciam-sign-in-call-api-node-express-web-apptill exempel , och kör sedan följande kommando:

    npm start
    

    Klientwebbappen startar.

  3. 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: