Oefening: de levenscyclus van aanvragen beheren
Tailwind Traders heeft hun toepassing nodig om enige basisbeveiliging te hebben. De Express-app moet onderscheid maken tussen geregistreerde klanten die toegang hebben en andere gebruikers die geen toegang moeten hebben. Andere functies, zoals rollenbeheer, kan mogelijk later worden toegevoegd.
Basisautorisatie toevoegen aan een Express-framework
De meeste toepassingen hebben onderdelen waartoe iedereen toegang heeft. Sommige onderdelen moeten echter worden beveiligd. Er zijn verschillende manieren om een toepassing te beveiligen. In deze oefening implementeert u een eenvoudig beveiligingssysteem om te begrijpen hoe het mechanisme van middleware werkt in het Express-framework.
Een webserver maken
In deze oefening gaat u verder met het gebruik van de dev-container. Er wordt een voorbeeldproject met productbestanden en starterstoepassingscode voor u verstrekt. U vult de ontbrekende onderdelen van het project in om de app-updates voor de klant te voltooien.
Open de map node-essentials/nodejs-http/exercise-express-middleware in een terminal door met de rechtermuisknop op de mapnaam te klikken en Open in geïntegreerde terminal te selecteren.
Deze map heeft drie bestanden: app.js, client.js en package.json.
Het bestand package.json bevat een afhankelijkheid met de naam
express
. Voer de volgende opdracht uit om de afhankelijkheid te installeren:npm install
npm
leest uit dedependencies
sectie in het package.json-bestand en installeert de vereiste pakketten.Open in een code-editor het app.js-bestand en inspecteer de inhoud:
const express = require("express"); const app = express(); const port = 3000; app.get("/", (req, res) => res.send("Hello World!")); app.get("/users", (req, res) => { res.json([ { id: 1, name: "User Userson", }, ]); }); app.get("/products", (req, res) => { res.json([ { id: 1, name: "The Bluest Eye", }, ]); }); app.listen(port, () => console.log(`Example app listening on port ${port}!`));
De code bevat een werkende Express-toepassing met drie routes: slash
/
,/users
en/products
.
Een clienttoepassing maken
Open in een code-editor het client.js toepassingsbestand en inspecteer de inhoud:
const http = require('http');
const options = {
port: 3000,
hostname: 'localhost',
path: '/users',
headers: {}
};
const req = http.get(options, (res) => {
console.log(`Connected - Status Code ${res.statusCode}`);
res.on('data', (chunk) => {
console.log("Chunk data: ", chunk.toString());
});
res.on('end', () => {
console.log('No more data');
});
res.on('close', () => {
console.log('Connection closed');
});
});
req.on('error', (error) => {
console.error('An error occurred: ', error);
});
req.end();
Deze code is een eenvoudige HTTP-client die verbinding maakt met de Express-toepassing. Het is geen webbrowser. Html wordt niet weergegeven. Het maakt alleen verbinding met de server en leest de gegevens die worden geretourneerd. Het is een goed voorbeeld van het gebruik van de HTTP-module uit Node.js.
De clienttoepassingscode maakt verbinding met het adres http://localhost:3000/users
voor de /users
route. De client luistert naar drie gebeurtenissen: data
, end
en close
. Bij het verzenden van een gebeurtenis worden alle functies die aan die specifieke gebeurtenis zijn gekoppeld synchroon aangeroepen. Dit zorgt voor de juiste volgorde van gebeurtenissen en helpt racevoorwaarden en logicafouten te voorkomen. Indien van toepassing kunnen listenerfuncties overschakelen naar een asynchrone bewerkingsmodus met behulp van de setImmediate()
of process.nextTick()
methoden. Dit wordt niet behandeld in deze module.
Het Express-programma uitvoeren
U kunt nu het Express-programma uitproberen met een clienttoepassing.
Start het Express-serverprogramma in de terminal door deze opdracht in te voeren:
node app.js
Notitie
Zorg ervoor dat u het app.js-bestand uitvoert dat zich bevindt op
/nodejs-http/exercise-express-middleware
.Open een tweede terminal en start de clienttoepassing:
node client.js
In de tweede terminal ziet u de volgende uitvoer van de client:
connected - statusCode: 200 chunk [{"id":1,"name":"User Userson"}] No more data Closing connection
De Express-server reageert met sommige gebruikersgegevens.
chunk [{"id":1,"name":"User Userson"}]
Alle onderdelen van de toepassing werken.De clienttoepassing wordt beëindigd nadat de uitvoer is weergegeven.
Druk in de eerste terminal (de Express-server) op Ctrl+C om het programma te stoppen.
De route beveiligen
Om deze route te beveiligen, voegen we code toe aan de Express-toepassing.
Open in een code-editor het bestand /nodejs-http/exercise-express-middleware/app.js . Zoek de
const app = express()
instructie. Voeg na deze instructie de volgende code toe:function isAuthorized(req, res, next) { const authHeader = req.headers.authorization; if (!authHeader || authHeader !== 'secretpassword') { return res.status(401).send('Unauthorized: Access Denied'); } next(); }
Zoek vervolgens de volgende codesectie in hetzelfde bestand:
app.get("/users", (req, res) => { res.json([ { id: 1, name: "User Userson", }, ]); });
Vervang deze sectie door de volgende code, zodat de
isAuthorized
middleware het tweede argument is:app.get("/users", isAuthorized, (req, res) => { res.json([ { id: 1, name: "User Userson", }, ]); });
Voer het Express-programma uit en roep de middleware aan
Probeer de clienttoepassing opnieuw met het bijgewerkte serverprogramma.
Voer in de eerste terminal de volgende opdracht uit om het Express-programma opnieuw op te starten:
node app.js
Start in de tweede terminal de clienttoepassing opnieuw op:
node client.js
In de tweede terminal ziet u de volgende uitvoer:
connected - statusCode: 401 chunk Not permitted No more data Closing connection
Deze keer wordt de
isAuthorized()
middleware aangeroepen en wordt gezocht naar eenauthorization
header met een specifieke waarde. Omdat u geen specifieke waarde hebt opgegeven als onderdeel van uw aanvraag, heeft de code niet gereageerd met specifieke gebruikersgegevens. In plaats daarvan waschunk Not permitted
het antwoord . In de volgende sectie voegt u specifieke autorisatie toe.Druk in de eerste terminal op Ctrl+C om het programma te stoppen.
Autorisatieheader toevoegen
U moet een authorization
header voor een specifieke waarde toevoegen.
Open in een code-editor het bestand nodejs-http/exercise-express-middleware/client.js opnieuw. Zoek de volgende instructie:
headers: {},
Vervang deze instructie door de volgende code:
headers: { authorization: 'secretpassword' },
Het Express-programma uitvoeren met clientautorisatie
Probeer de client opnieuw met een authorization
header.
Voer in de eerste terminal de volgende opdracht uit om het Express-programma opnieuw op te starten:
node app.js
Voer in de tweede terminal de volgende opdracht uit om de client opnieuw uit te voeren:
node client.js
In de tweede terminal ziet u nu de volgende uitvoer:
connected - statusCode: 200 chunk [{"id":1,"name":"User Userson"}] No more data Closing connection
De gebruikersgegevens worden geretourneerd omdat u een
authorization
header met een geaccepteerde waarde hebt doorgegeven.Druk in de eerste terminal op Ctrl+C om het programma te stoppen.
Gefeliciteerd. U hebt geleerd hoe u middleware in Express kunt gebruiken om preprocessing, basisautorisatie toe te voegen aan uw Express-programma.
Let op
Houd er rekening mee dat een verificatie/autorisatie die is bedoeld voor gebruik in de echte wereld een robuuster moet zijn dan in dit voorbeeld. Het is de moeite waard om concepten zoals OAuth, JSON-webtokens, JWT en bibliotheek-bcrypt op te zoeken om ervoor te zorgen dat uw app beveiliging heeft tegen onbevoegde gebruikers.
Ontwikkelcontainer opschonen
Nadat u het project hebt voltooid, kunt u uw ontwikkelomgeving opschonen of teruggaan naar de typische status.
Als u de GitHub Codespaces-omgeving verwijdert, zorgt u ervoor dat u de hoeveelheid gratis rechten per kernuren kunt maximaliseren die u voor uw account krijgt.
Belangrijk
Zie GitHub Codespaces maandelijks inbegrepen opslag- en kernuren voor meer informatie over de rechten van uw GitHub-account.
Meld u aan bij het GitHub Codespaces-dashboard (https://github.com/codespaces).
Zoek uw momenteel uitgevoerde Codespaces die afkomstig zijn uit de
MicrosoftDocs/node-essentials
GitHub-opslagplaats.Open het contextmenu voor de coderuimte en selecteer Verwijderen.