Udostępnij za pośrednictwem


Wywoływanie internetowego interfejsu API w aplikacji internetowej Node.js

Dotyczy:Biały okrąg z szarym symbolem X. Dzierżawcy siły roboczej — dzierżawcy zewnętrzni Zielony okrąg z białym symbolem znacznika wyboru. (dowiedz się więcej)

Z tego artykułu dowiesz się, jak wywołać internetowy interfejs API z aplikacji internetowej klienta Node.js przy użyciu tokenu dostępu uzyskanego w sekcji Uzyskiwanie tokenu dostępu. Internetowy interfejs API jest chroniony przez Tożsamość zewnętrzna Microsoft Entra. Ten artykuł jest czwartą i ostatnią częścią czteroczęściowej serii przewodników.

Warunek wstępny

Aktualizowanie kodu

  1. W edytorze kodu otwórz plik routes/todos.js , a następnie dodaj następujący 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;
    

    Ten plik zawiera trasy ekspresowe do tworzenia, odczytywania i usuwania zasobu w chronionym interfejsie API. Każda trasa używa trzech funkcji oprogramowania pośredniczącego, które są wykonywane w tej sekwencji:

    • isAuthenticated Sprawdza, czy użytkownik jest uwierzytelniony.

    • getToken żąda tokenu dostępu. Ta funkcja została zdefiniowana wcześniej w sekcji Uzyskiwanie tokenu dostępu. Na przykład trasa tworzenia zasobu (żądanie POST) żąda tokenu dostępu z uprawnieniami do odczytu i zapisu.

    • postToDo Na koniec metody or deleteToDo getToDos obsługują rzeczywistą logikę manipulowania zasobem. Te funkcje są definiowane w pliku kontrolera/todolistController.js .

  2. W edytorze kodu otwórz plik controller/todolistController.js , a następnie dodaj następujący 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);
            }
        };
    

    Każda z tych funkcji zbiera wszystkie informacje wymagane do wywołania interfejsu API. Następnie deleguje pracę do callEndpointWithToken funkcji i czeka na odpowiedź. Funkcja jest zdefiniowana callEndpointWithToken w pliku fetch.js . Na przykład aby utworzyć zasób w interfejsie API, postToDo funkcja przekazuje punkt końcowy, token dostępu, metodę HTTP i treść żądania do callEndpointWithToken funkcji i czeka na odpowiedź. Następnie przekierowuje użytkownika do widoku todo.hbs , aby wyświetlić wszystkie zadania.

  3. W edytorze kodu otwórz plik fetch.js , a następnie dodaj następujący 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,
        };
    

    Ta funkcja wykonuje rzeczywiste wywołanie interfejsu API. Zwróć uwagę, że token dostępu jest dołączany jako wartość tokenu elementu nośnego w nagłówku żądania HTTP:

        //...        
        headers: {
            Authorization: `Bearer ${accessToken}`,
        }        
        //...
    
  4. W edytorze kodu otwórz plik env , a następnie dodaj następującą konfigurację:

        # 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'
    

    Ustawienie NODE_TLS_REJECT_UNAUTHORIZED='0' w pliku env powoduje, że Node.js zignorować błędy certyfikatu SSL, takie jak błąd certyfikatu z podpisem własnym.

  5. W edytorze kodu otwórz app.js plik, a następnie:

    1. Dodaj router zadań do wykonania przy użyciu następującego kodu:

          var todosRouter = require('./routes/todos');
      
    2. Użyj routera zadań do wykonania przy użyciu następującego kodu:

          app.use('/todos', todosRouter); 
      

Uruchamianie i testowanie aplikacji internetowej i interfejsu API

Na tym etapie możesz wywołać internetowy interfejs API z poziomu aplikacji internetowej klienta:

  1. Wykonaj kroki opisane w artykule Zabezpieczanie internetowego interfejsu API ASP.NET, aby uruchomić aplikację internetowego interfejsu API . Internetowy interfejs API jest teraz gotowy do obsługi żądań klientów.

  2. W terminalu upewnij się, że jesteś w folderze projektu zawierającym aplikację internetową klienta, taką jak ciam-sign-in-call-api-node-express-web-app, a następnie uruchom następujące polecenie:

    npm start
    

    Uruchamiana jest aplikacja internetowa klienta.

  3. Wykonaj kroki opisane w artykule Uruchamianie i testowanie przykładowej aplikacji internetowej i interfejsu API , aby pokazać, jak aplikacja kliencka wywołuje internetowy interfejs API.

Następne kroki

Możesz chcieć: