Oefening: de levenscyclus van aanvragen beheren

Voltooid

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.

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

  2. 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 de dependencies sectie in het package.json-bestand en installeert de vereiste pakketten.

  3. 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 /, /usersen /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, enden 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.

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

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

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

  1. 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();
     }
    
  2. Zoek vervolgens de volgende codesectie in hetzelfde bestand:

    app.get("/users", (req, res) => {
      res.json([
        {
          id: 1,
          name: "User Userson",
        },
      ]);
    });
    
  3. 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.

  1. Voer in de eerste terminal de volgende opdracht uit om het Express-programma opnieuw op te starten:

    node app.js
    
  2. 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 een authorization 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 was chunk Not permittedhet antwoord . In de volgende sectie voegt u specifieke autorisatie toe.

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

  1. Open in een code-editor het bestand nodejs-http/exercise-express-middleware/client.js opnieuw. Zoek de volgende instructie:

    headers: {},
    
  2. Vervang deze instructie door de volgende code:

    headers: {
      authorization: 'secretpassword'
    },
    

Het Express-programma uitvoeren met clientautorisatie

Probeer de client opnieuw met een authorization header.

  1. Voer in de eerste terminal de volgende opdracht uit om het Express-programma opnieuw op te starten:

    node app.js
    
  2. 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.

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

  1. Meld u aan bij het GitHub Codespaces-dashboard (https://github.com/codespaces).

  2. Zoek uw momenteel uitgevoerde Codespaces die afkomstig zijn uit de MicrosoftDocs/node-essentials GitHub-opslagplaats.

    Screenshot of all the running codespaces including their status and templates.

  3. Open het contextmenu voor de coderuimte en selecteer Verwijderen.

    Screenshot of the context menu for a single codespace with the delete option highlighted.