Wywoływanie internetowego interfejsu API w aplikacji internetowej Node.js
Dotyczy: Dzierżawcy siły roboczej — dzierżawcy zewnętrzni
(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
- Wykonaj kroki opisane w pierwszej części tej serii przewodników Przygotowywanie dzierżawy zewnętrznej do wywoływania interfejsu API w aplikacji internetowej Node.js.
- Wykonaj kroki opisane w drugiej części tej serii przewodników Przygotowywanie aplikacji do wywoływania interfejsu API w aplikacji internetowej Node.js.
- Wykonaj kroki opisane w trzeciej części tej serii przewodników Uzyskiwanie tokenu dostępu w artykule Node.js aplikacji internetowej.
Aktualizowanie kodu
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 ordeleteToDo
getToDos
obsługują rzeczywistą logikę manipulowania zasobem. Te funkcje są definiowane w pliku kontrolera/todolistController.js .
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 zdefiniowanacallEndpointWithToken
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 docallEndpointWithToken
funkcji i czeka na odpowiedź. Następnie przekierowuje użytkownika do widoku todo.hbs , aby wyświetlić wszystkie zadania.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}`, } //...
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.W edytorze kodu otwórz
app.js
plik, a następnie:Dodaj router zadań do wykonania przy użyciu następującego kodu:
var todosRouter = require('./routes/todos');
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:
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.
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.
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ć: