Cvičení – správa životního cyklu požadavku

Dokončeno

Společnost Tailwind Traders potřebuje svou aplikaci, aby měla základní zabezpečení. Aplikace Express by měla rozlišovat mezi registrovanými zákazníky, kteří mají přístup, a jinými uživateli, kteří nemají přístup. Další funkce, jako je správa rolí, bude možné přidat později.

Přidání základní autorizace do architektury Expressu

Většina aplikací má části, ke kterým mají přístup všichni. Ale některé části je potřeba chránit. Existují různé způsoby ochrany aplikace. V tomto cvičení implementujete jednoduchý systém ochrany, abyste pochopili, jak mechanismus middlewaru funguje v rozhraní Express.

Vytvoření webového serveru

V tomto cvičení pokračujte v používání vývojového kontejneru. K dispozici je ukázkový projekt, který obsahuje soubory produktů a počáteční kód aplikace. Vyplníte chybějící části projektu a dokončíte aktualizace aplikace pro zákazníka.

  1. Otevřete složku node-essentials/nodejs-http/exercise-express-middleware v terminálu tak, že kliknete pravým tlačítkem na název složky a vyberete Otevřít v integrovaném terminálu.

    Tato složka obsahuje tři soubory: app.js, client.js a package.json.

  2. Soubor package.json obsahuje závislost s názvem express. Spuštěním následujícího příkazu nainstalujte závislost:

    npm install
    

    npm přečte z oddílu dependencies v souboru package.json a nainstaluje požadované balíčky.

  3. V editoru kódu otevřete soubor app.js a zkontrolujte jeho obsah:

    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}!`));
    

    Kód obsahuje funkční aplikaci Express se třemi trasami: lomítko /, /usersa /products.

Vytvoření klientské aplikace

V editoru kódu otevřete soubor client.js aplikace a zkontrolujte jeho obsah:

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();

Tento kód je jednoduchý klient HTTP, který se připojuje k aplikaci Express. Není to webový prohlížeč. Nevykresluje HTML. Jenom se připojí k serveru a přečte vrácená data. Je to dobrý příklad použití modulu HTTP z Node.js.

Kód klientské aplikace se připojí k adrese http://localhost:3000/users trasy /users . Klient naslouchá třem událostem: data, enda close. Při generování události se všechny funkce připojené k této konkrétní události volají synchronně. Tím se zajistí správné sekvencování událostí a pomůže se vyhnout konfliktům časování a chybám logiky. V případě potřeby můžou funkce naslouchacího procesu přepnout do asynchronního režimu operace pomocí setImmediate() metod nebo process.nextTick() metod. Toto se v tomto modulu nezabývá.

Spuštění programu Express

Teď jste připraveni vyzkoušet program Express s klientskou aplikací.

  1. V terminálu spusťte program serveru Express zadáním tohoto příkazu:

    node app.js
    

    Poznámka:

    Ujistěte se, že používáte soubor app.js umístěný na adrese /nodejs-http/exercise-express-middleware.

  2. Otevřete druhý terminál a spusťte klientskou aplikaci:

    node client.js
    

    Ve druhém terminálu by se měl zobrazit následující výstup z klienta:

    connected - statusCode: 200
    chunk [{"id":1,"name":"User Userson"}]
    No more data
    Closing connection
    

    Server Express odpoví některými uživatelskými daty. chunk [{"id":1,"name":"User Userson"}] Všechny části aplikace fungují.

    Klientská aplikace skončí po zobrazení výstupu.

  3. V prvním terminálu (server Express) ukončete program stisknutím kombinace kláves Ctrl+C.

Ochrana trasy

Abychom tuto trasu ochránili, přidáme do aplikace Express nějaký kód.

  1. V editoru kódu otevřete soubor /nodejs-http/exercise-express-middleware/app.js . const app = express() Vyhledejte příkaz. Za tento příkaz přidejte následující kód:

    function isAuthorized(req, res, next) {
       const authHeader = req.headers.authorization;
    
       if (!authHeader || authHeader !== 'secretpassword') {
         return res.status(401).send('Unauthorized: Access Denied');
       }
    
       next();
     }
    
  2. Dále ve stejném souboru vyhledejte následující část kódu:

    app.get("/users", (req, res) => {
      res.json([
        {
          id: 1,
          name: "User Userson",
        },
      ]);
    });
    
  3. Nahraďte tuto část následujícím kódem, aby isAuthorized middleware byl druhým argumentem:

    app.get("/users", isAuthorized, (req, res) => {
      res.json([
        {
          id: 1,
          name: "User Userson",
        },
      ]);
    });
    

Spuštění programu Express a vyvolání middlewaru

Zkuste klientskou aplikaci znovu s aktualizovaným serverovým programem.

  1. V prvním terminálu spusťte následující příkaz, který restartuje program Express:

    node app.js
    
  2. V druhém terminálu restartujte klientskou aplikaci:

    node client.js
    

    Ve druhém terminálu by se měl zobrazit následující výstup:

    connected - statusCode: 401
    chunk Not permitted
    No more data
    Closing connection
    

    Tentokrát se isAuthorized() middleware vyvolá a vyhledá hlavičku authorization , která má konkrétní hodnotu. Protože jste v rámci požadavku nezadali konkrétní hodnotu, kód neodpověděl s konkrétními uživatelskými daty. Místo toho byla chunk Not permittedodpověď . V další části přidáte konkrétní autorizaci.

  3. V prvním terminálu program zastavíte stisknutím kombinace kláves Ctrl+C.

Přidání autorizační hlavičky

Potřebujete přidat authorization záhlaví pro určitou hodnotu.

  1. V editoru kódu znovu otevřete soubor nodejs-http/exercise-express-middleware/client.js . Vyhledejte následující příkaz:

    headers: {},
    
  2. Nahraďte tento příkaz následujícím kódem:

    headers: {
      authorization: 'secretpassword'
    },
    

Spuštění programu Express s autorizací klienta

Zkuste klienta znovu s hlavičkou authorization .

  1. V prvním terminálu spusťte následující příkaz, který restartuje program Express:

    node app.js
    
  2. V druhém terminálu spusťte znovu klienta spuštěním následujícího příkazu:

    node client.js
    

    Ve druhém terminálu byste teď měli vidět následující výstup:

    connected - statusCode: 200
    chunk [{"id":1,"name":"User Userson"}]
    No more data
    Closing connection
    

    Uživatelská data se vrátí, protože jste předali hlavičku authorization s přijatou hodnotou.

  3. V prvním terminálu program zastavíte stisknutím kombinace kláves Ctrl+C.

Blahopřejeme! Naučili jste se, jak pomocí middlewaru v Expressu přidat do programu Express předběžné zpracování, základní autorizaci.

Upozornění

Mějte na paměti, že ověřování/autorizace určené pro skutečné použití musí být robustnější než v tomto příkladu. Je vhodné vyhledat koncepty, jako jsou OAuth, JSON Web Tokens, JWT a kryptografie knihovny, abyste měli jistotu, že vaše aplikace má ochranu před neoprávněnými uživateli.

Vyčištění vývojového kontejneru

Po dokončení projektu můžete chtít vyčistit vývojové prostředí nebo ho vrátit do typického stavu.

Odstraněním prostředí GitHub Codespaces zajistíte, že můžete maximalizovat nárok na počet bezplatných hodin za jádro, které získáte pro svůj účet.

Důležité

Další informace o oprávněních účtu GitHub najdete v tématu GitHub Codespaces měsíčně zahrnuté hodiny úložiště a jádra.

  1. Přihlaste se k řídicímu panelu GitHub Codespaces (https://github.com/codespaces).

  2. Vyhledejte aktuálně spuštěné Codespaces zdrojové z MicrosoftDocs/node-essentials úložiště GitHub.

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

  3. Otevřete místní nabídku pro codespace a vyberte Odstranit.

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